CF-Round-#560(Div.3)
Posted mile-star
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF-Round-#560(Div.3)相关的知识,希望对你有一定的参考价值。
A
题意:给定n,x,y(0≤y<x<n≤2e5)和一个长度为n的只有0和1组成的数字,然后可以对这个数字进行两种操作,一是把这个数某一位上的0变成1,二是把某位上的1变成0,要求通过上述两种操作使得修改后的数对10的x次方取余结果为10的y次方,求修改最少次数。
思路:给定数字长度为n,10的x次方长度为x+1,10的y次方长度为y+1,如果进行取余,给定数字的前n-x-1位并不会影响取余结果故不需要考虑,只需判断n-x-1后面的就可以了,即n-x-2位为1,后面的数字均为0;遍历判断一下,n-x-2位为0,答案++,n-x-2位后面的每遇到一个1即答案++;
B
题意:从第一天开始训练,第i天可以解决i道题,有n个比赛,给定n个数表示每个比赛的题目数,问最多可以训练多少天;
思路:题目要求第i天训练选择的比赛其中的题目数必须大于等于i,如果没有满足条件的就停止训练;所以我们只需要排序下,从第一天开始记录下当前训练是第几天,如果可以找到题数>=天数的比赛就天数++,遍历一边题目数组就能得到答案,最后答案为天数-1;
C
题意:定义一个字符串是好的当这个字符串长度为偶数且奇数位上的字母不等于下一位上的字母,字符串由小写字母组成,给定字符串长度n,问最少删除几个字母可以使字符串变为好的,空字符串为好的字符串
思路:先遍历字符串,如果奇数位上的字母等于下一个字母,删除奇数位上的字母,重新判断当前奇数为上的字母是否仍然和下一位相同,如果相同就继续删除判断直到不同,遍历判断结束后,如果字符串长度为奇数,将最后一位字母删除。
D
题意:给定一个序列,询问这个序列是否能组成一个数除1和本身之外的因子序列,如果可以输出这个数,否则输出-1。
思路:假设我们要求的这个数存在,那么这个序列中最小数和最大数乘积应该等于所求数,所以我们可以先对所给序列排序,通过第一项和最后一项得出我们假设的答案,然后将假设答案进行因数分解,最后判断得到的因数序列和题目所给序列是否一致即可,如果不相等则不存在满足题意的答案,否则输出假设答案
E
题意:给定n,然后是两个长度为n的序列a和b,定义f(l,r)为ai*bi(l<=i<=r)之和,可以改变b的顺序,求f(l,r)(1<=l<=r<=n)之和最小值,答案对998244353取余;
对公式进行推导:
$$
\beginalign
f(1,1) &= a_1*b_1;\\
f(1,2) &= a_1*b_1+a_2*b_2;\\
f(1,3) &= a_1*b_1+a_2*b_2+a_3*b_3;\\
\dots\dots\\
f(1,n) &=a_1*b_1+a_2*b_2+ \dots\dots\ +a_n*b_n;
\endalign
$$
依次写出f(2,2...n),f(3,3...n)观察可以发现 a1乘b1出现了n次,a2乘b2出现了2(n-1)次,a3乘b3出现了3(n-2)次,以此类推得到公式
$$
ans = \sum i*(n-i+1)*ai*bi
$$
先对序列a进行操作,令ai = aix(n-i+1)xi;
对a,b分别排序,用a里面最小的乘b里最大的,a里第二大的乘第二小的,依次类推求得最小值;
F1
题意:给定n,表示n个商品,给定一个序列,表示每个商品的需求量,再给出m个打折信息,每个信息由d,t组成,表示第t件商品在第d天打折;开始手中没钱,每天白天可以赚一块钱,晚上可以去买商品,所有商品原价均为2元,打折后为1元,问最少多少天可以买到所有需要的商品
思路:贪心,购买某件商品时可以等到这件商品最后一次打折的时候再去购买,如果手中的钱可以全部购买就全部买过来,如果不够,就把全部钱用来买,因为时间越长手中可用的的钱越多,我们可以枚举最少天数day,进行判断,在day天里,先贪心的购买有打折的商品,如果在day天剩下的钱数大于等于还没购买的商品价值总和,就可以在第day天完成采购,我们可以得到 day天里赚的总钱数 = 购买打折商品的钱 + 购买不打折商品的钱,贪心时可以将购买打折商品的钱扣去,剩下的就是购买不打折商品花的钱;
以上是关于CF-Round-#560(Div.3)的主要内容,如果未能解决你的问题,请参考以下文章
C Good String Codeforces Round #560 (Div. 3)
Codeforces Round #560 (Div. 3) B题
Codeforces Round #560 (Div. 3) A题