A题随便过了
B题,每个烤箱都有各自的产能,每秒可以去拿积累的产品
赛时想到,最后一步一定是最大产能的那个,因为这样最大产能的那个积累的最多一定要拿到。
然后有一点dp的想法,所以当n<m的时候,有
int t, n, m;
cin >> t;
while (t--)
{
cin >> n >> m;
for(int i = 1; i <= n; i++) {
cin >> speed[i];
}
for(int j = 1; j <= m; j++) {
f[1][j] = speed[1] * j;//注:需要优化
}
for(int i = 2; i <= n; i++) {
for (int j = 2; j <= m; j++) {
f[i][j] = f[i-1][j-1] + j * speed[i];
}
}
cout << f[n][m] << endl;
}
发现n<m的时候无解,而且此时时间复杂度极高。
后面就没去想了,因为已经24点了
现在认真抄袭他人解法(https://codeforces.com/blog/entry/146178) 之后,获得了一些结论:
当n(烤箱数)> m (秒数) 的时候,一定是从产能前m的烤箱中去拿,而且昨晚推出来了,是从前x个里面轮流拿,按照先小后大的原则。
那么完备了理论之后,就可以总结出来
先把烤箱产能降序排
烤箱ovencount = min (n,m)
i从0遍历到ovencount-1, 对每个i,他是倒数第i个拿出来的,那么积累的量就是(m-i)*a[i]
这时就有一个疑问,当ovencount=n,那么不可能每个烤箱只取一次,那么这个积累量是怎么算的呢?
这就涉及昨天推的子问题,昨天认为是在前i个里面选的。也就是最小的i个里面的子问题,
暂时不知道咋推
ls:m>n的时候,对后n秒的取法就跟之前一样,他们积累的权是n-i 对前面m-n秒,对一个特定物品i,其取一次,其他物品就会积累1次,那么对每个物品i都取一次,其他物品就会积累m-n-1次,而且这个物品在这时取的时候也取了一次,那就是m-n的权
comment 评论区
star_outline 咱快来抢个沙发吧!