【题解】天明的背包
题面:
天明有一些背包
背包可以装背包
背包可以装装了背包的背包
背包可以装装了很多背包的背包...
具体来说,地上有n个位置
你可以看到每个位置上有一个背包,背包从1到n依次编号
一开始第i个背包里有ai个背包
现在天明要整理一下背包
从第二个背包开始(第一个背包不用整理)
整理第i个背包的方法:
将该背包的前k个背包中所装背包最多的背包j中的背包取出
(如果前方不足k个背包,则从第1个背包开始)
放入第i个背包
然后为了保持那个被取出了所有背包的背包j的整理完了的状态
天明会从他的口袋里(他的口袋也是一个背包)掏出一些背包放入背包j中
使得背包j中的背包数量恢复
整理后,他想知道第n个位置有多少个背包
天明想了101ms,觉得实在是太简单了(入门题难度) 于是他不给你样例,并且将时限降至100ms
分析:
这是一道入门题,虽然题面很绕,但是超级简单,不过也要注意读题,注意细节
显然,整理第i个背包选取的背包j一定是第i-1个背包
所以所有背包里的背包总数,就是整理后的第n个背包里的背包数
然后加一即可(因为“他想知道第n个位置有多少个背包”,第n个位置要包含最外层的背包),没加一就爆零喽
对,k没用(唯一的用处就是骗人模拟TLE爆零)
不开long long WA on 2
用cin很慢 (cin cout不特殊处理比scanf printf慢)
总结一下:仔细读题,理清思路,注意细节,不被干扰,记得long long
代码:
#include <cstdio>
using namespace std;
long long n,k,a,ans;
int main() {
scanf("%lld %lld",&n,&k);
for(int i=1;i<=n;i++) {
scanf("%lld",&a);
ans+=a;
}
printf("%lld",ans+1);
return 0;
}