分组赛
T1 B4361 [GESP202506 四级] 排序
水题来的,n最大也就3000而已,往冒泡模板里加个计数秒赤()
T2 P10719 [GESP202406 五级] 黑白格
最简单也最好理解的办法就是找到所有的子矩形,然后再用二维前缀和求值并与k比较就行了
不难,数据很弱,直接枚举但要仔细读题......
(不然就像某人没看输入要求惨遭零分)
/*for(int i=1;i<=n;i++) //错误的读入 for(int j=1;j<=m;j++)cin>>a[i][j];*/for(int i=0;i<n;i++) //正确的读入 {cin>>A;for(int j=1;j<=m;j++){if(A[j-1]=='0')a[i+1][j]=0;elsea[i+1][j]=1;}}
T3 B3930 [GESP202312 五级] 烹饪问题
这个题数据巨水,暴力19代码行直接满分(虽然没AC但那几个点不计分,优化一下就能满了)
后来听评讲,的那个思路简单点来说就是从最高位到最低位逐位确定答案的每一位是0还是1,并实时把候选区间缩小到“可能产生最优解”的那一段数字上,直到只剩两个数,直接取它们的与即可(参考文献:传送门)
T4 P10724 [GESP202406 七级] 区间乘积
不算难,先二分答案出x,用贪心能否≤k 段,可行就再小一点,不可行就再大一点,直到锁定最符合条件的x
大概的流程呢就是:
1.直接二分“每段和的最大值”这个答案 x,范围是 max(a[i])≤x≤sum(a[i])
2.从左往右贪心扫一遍:
把数字依次累加,当前段和一旦>x 就立即切一刀,段数加1。
如果扫完整个序列所用段数≤k,说明x可行,反之则不可行。
3.当二分推进到可行的答案时:收紧右端,尝试更小的x
当二分推进到不可行的答案时:收紧左端,增大x
4.当左右端点重合时,答案就出来了
T5 P13013 [GESP202506 五级] 奖品兑换
这玩意我自己都没搞懂,就不乱写东西误导别人了()
组队赛
因为是组队进行的嘛,我们组的策略是各自为营,一人负责一部分题,所以这我就讲讲我敲的那几个
T2 P1455 搭配购买
捆绑销售的奸商
很容易就能想到背包,仔细想想,好像只需要把那些捆绑销售互相配对的云的价值与价格(“重量”)合并到一起,接着对新数据们跑一轮01背包就可以了
所以问题就变成了怎么把这堆云合并到一起去
众所周知并查集是个好用的东西()
所以思路就很明显了,用并查集合并数据,然后对新数据跑一轮01背包,解决
T2 P7076 [CSP-S2020] 动物园
其实这题我之前做过()
也挺水的,有一个条件是“所有的 q i互不相同”,所以就连c和q都不用读进来()
他就是有俩很大的坑点,一是要是不开unsigned long long
的话数据会超,第二呢是这题有个测试点要读入的n是0......为什么动物园里的动物数量会是 0 ???题目第一句不是说 动物园里饲养了很多动物 吗???
那个测试点的输出是18446744073709551616
相当于是ull
越界之后的值减一(我也不知道为什么要减一),(unsigned long long)-1)
就能得到18446744073709551617
了,而且这个点只占5分()
先用|
计算出所有已有的动物编号中,哪些动物至少存在一次,然后再计算出手册要求购买的饲料位数是那些,用手册的位减去动物的位,那就s剩下来t个位可能为1,故而那总动物数就能达到2的t次方,减去已经有的n个动物,所以答案就是