【题解】天明的背包

· · 个人记录

题面:

天明有一些背包

背包可以装背包

背包可以装装了背包的背包

背包可以装装了很多背包的背包...

具体来说,地上有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;
}