CF175C
貪心,注意有不少細節,很容易死迴圈TLE
貪心是顯而易見的,每次列舉價值最小的物品,進行銷燬操作
樸素的列舉每一件物品複雜度為\(O(\sum k_i)\),明顯超時
我們注意到樸素的+1列舉中有很多情況是重複的,那就可以通過乘法來跳過
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,ans,m,p[105];
struct obj{int k,c;}a[105];
inline bool cmp(const obj &x,const obj &y){return x.c<y.c;} //按物品數量進行排序
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].k,&a[i].c);
sort(a+1,a+1+n,cmp);
scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d",&p[i]);
p[m+1]=0x7fffffffffff; //防止f溢位
int pt=0,f=1; //pt記錄已經操作過的物品數
for(int i=1;i<=n;i++){
for(int j=1;j<=a[i].k;){
int how=min(a[i].k-j+1,p[f]-pt); //正解與暴力的區別:要麼對該種物品的所有剩餘進行操作,要麼對到下一個目標所需要的物品數進行操作
ans+=f*a[i].c*how;
pt+=how;
while(pt>=p[f]&&f<=m) f++;
j+=how;
}
}
printf("%I64d",ans);
}