题意:
解法:
几个很容易想到的结论:
1.由于k<=2000,虽然n<=2e5,但是一定买的是最便宜的k个,因此排序取前k个即可.
2.对于offer的优惠(x,y),一定是选择最贵的x个.
3.对于优惠(x,y1),(x,y2),如果y1>y2,那么(x,y2)显然是没用的.
令ma[x]表示size=x的offer中,最大的y是多少.
令d[i]表示买i个物品需要的最小代价,d[i]的初值为d[i-1]+a[i]
枚举j,满足0<=j<i如果存在(i-j,p)的offer,那么d[i]=min(d[i],sum[i]-sum[j+p]+d[j]).
最后d[k]就是答案.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+5;
int sum[maxm];
int ma[maxm];
int d[maxm];
int a[maxm];
int n,m,k;
void solve(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=m;i++){
int x,y;cin>>x>>y;
ma[x]=max(ma[x],y);
}
for(int i=1;i<=k;i++){
d[i]=d[i-1]+a[i];
for(int j=0;j<=i-1;j++){
int dif=i-j;
if(ma[dif]){
d[i]=min(d[i],sum[i]-sum[j+ma[dif]]+d[j]);
}
}
}
cout<<d[k]<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
return 0;
}