专栏文章

题解:P10010 [集训队互测 2023] Grievous Lady

P10010题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mins9x3g
此快照首次捕获于
2025/12/02 07:31
3 个月前
此快照最后确认于
2025/12/02 07:31
3 个月前
查看原文
  1. 题目分析 这道题一眼搜索或者动规,因为我看不出来怎么动规,所以准备用搜索解这道题。 
  2. 题目做法 (1) 直接暴力搜索 (12pts) 我们将 当作题目中 , 数组的长度,将 当作搜索到哪一层了,这样我们便可以写出暴力代码: __int128 ans; __int128 x ,y; void dfs(int r,int c) { if(c==r+1) { __int128 s =x*y; if(s>ans) ans =s; return ; } x +=a[c].x; dfs(r,c+1); x -=a[c].x; y +=a[c].y; dfs(r,c+1); y -=a[c].y; }  此算法时间复杂度为 让我们再看看数据范围,,这不得直接 T 飞? (2) 整体贪心+局部搜索(100pts) 本蒟蒻也是看了第一篇题解才有的思路,我们发现,因为题目数据范围是随机的,并且值域非常大,所以 和 的值一般不会太接近,我们只需要取更大的那个数即可。 但是这样做会有缺点,如果有 和 比较接近的情况出现,便很容易举出反例,这一部分我们就只能用搜索解决。 于是,我们可以先将 , 数组以 为排序标准进行降序排列,然后取正中间的 个左右的断点进行枚举,先将断点左边大部分数和右边大部分数加入总数中,再暴力搜索断点附近的一些数更新答案就行了。 求总和的代码大概是这样: void sum(int k) { x =0,y=0; //确定搜索范围 int l=max(1,k-5),r=min(n,k+5); //整体贪心 for(int i=1;i<l;i++) x +=a[i].x; for(int i=r+1;i<=n;i++) y +=a[i].y; //局部搜索 dfs(r,l); }  这样就可以将这道题切掉了。

评论

0 条评论,欢迎与作者交流。

正在加载评论...