题解 CF1117B 【Emotes】

justinjia

2021-01-17 21:17:00

Solution

这是一道比较水(你看这题难度不就是水的颜色吗)的小学奥数题(考察知识点:周期问题)。。。 [此题解在题解区域食用更佳(原因:我那个表格在博客里貌似显示不出来)](http://www.luogu.com.cn/problem/solution/CF1117B) 首先搭上框架: ```cpp #include"stdio.h"//我习惯这么写 #include"algorithm" using namespace std; #define int long long//根据本题的数据范围,需要开long long signed main(void){//signed等同于int,如果还写int main(void)的话就相当于long long main(),会CE int n,m,k,a[200000]; scanf("%lld%lld%lld",&n,&m,&k);//别忘了我们这是long long,我曾经因为占位符写错而被卡了N次 for(int i=0;i<n;i++) scanf("%lld",&a[i]); sort(a,a+n); ``` 接下来,你可能会用循环来累加每次选择的表情,但是这样会$\colorbox{darkblue}{\color{white}TLE}$。 那该怎么办呢? 就像我第一句话所说的,这题就是个小学奥数题,一个简单的周期问题。最优方案如下表: |使用的第几个表情|表情编号(从$0$开始,排序后)| |-|-| |$1$|$n-1$| |$2$|$n-1$| |$......$|$......$| |$k$|$n-1$| |$k+1$|$n-2$| |周期结束分割线|$-----------$| |$k+2$|$n-1$| |$k+3$|$n-1$| |$......$|$......$| |$2k$|$n-1$| |$2k+1$|$n-2$| |周期结束分割线|$-----------$| |$2k+2$|$n-1$| |$......$|$......$| |$m$|$n-1$(如果$m\bmod k=0$,则为$n-2$)| 所以,我们要定义一个变量,统计最后结果: ```cpp int ans=0; ``` 后面要加上好多个数,我就分开写,这样看的更清楚: ```cpp ans+=m/(k+1)*(a[n-1]*k+a[n-2]); ``` 其中,`m/(k+1)`为**完整**周期个数,`a[n-1]*k`为周期中第$1$~$k$个表情快乐值的总和,`a[n-2]`就是周期中第$k+1$个表情的快乐值。 然后处理不完整周期: ```cpp ans+=m%(k+1)*a[n-1]; ``` `m%(k+1)`就是不完整周期数的个数,剩下的应该不用我解释了吧。 最后: ```cpp printf("%lld",ans);//再次提醒我们这是long long return 0; } ``` 放上完整代码: ```cpp #include"stdio.h" #include"algorithm" using namespace std; #define int long long signed main(void){ int n,m,k,a[200000],cnt=0; int ans=0; scanf("%lld%lld%lld",&n,&m,&k); for(int i=0;i<n;i++) scanf("%lld",&a[i]); sort(a,a+n); ans+=m/(k+1)*(a[n-1]*k+a[n-2])+m%(k+1)*a[n-1]; printf("%lld",ans); return 0; } ``` 最后说两件事: 第一件事是给管理们说的:**这是蒟蒻的第一篇题解,求过!** 第二件事是给过路的大佬们说的:**这是蒟蒻的第一篇题解,可能会存在不少错误,欢迎大佬来喷!**