题解:P13521 [KOI 2025 #2] 包
0.更新日志
- 2025.8.3:修正了一处笔误,并修改、润色内容。
1.题目思路
由于小偷会取
但是,商户每次还会取出若干个(可能为零)物品装入包中。什么时候答案最大呢?
我们考虑维护一个指针
但是,这个方法无法通过样例#3!为什么呢?考虑样例#3中,
此时,我们发现,商户不一定要把包装满。
由于
:::warning[本题数据范围]{open}
十年OI一场空,(下一句你懂得)。
本题的前缀和数组,以及答案变量都需要开
2.代码
注:代码仅供参考。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int max_n=5005;
int n,k,c,a[max_n],l;
long long sum[max_n],ksum[max_n],ans; //开 long long!
int main(){
scanf("%d %d %d",&n,&k,&c);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+n+1); //排序
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+a[i]; //计算前缀和
}
for(int i=k;i<=n;i++){
ksum[i]=sum[i]-sum[i-k]; //K个数的和
}
for(int i=1;i<=c;i++){
while(sum[l]<=i&&l<=n-k){ //保证满足条件时,计算最大值(注意一开始也有可能选 0 个)
ans=max(ans,ksum[l+k]);
l++; //指针
}
printf("%lld\n",ans); //输出
}
return 0;
}
3.后记
更多内容,请移步至:
\color{red}\texttt{Luogu ryf2011} ;\color{orange}\texttt{cnblogs(博客园) cnblogs2011ryf} 。