链接
https://codeforces.com/problemset/problem/1154/F
题解
首先,我肯定买最便宜的前
k
k
k个
那现在就剩下
2000
2000
2000个商品了
而且大于
2000
2000
2000的优惠也都不需要了
那么就是一个
k
2
k^2
k2的
d
p
dp
dp了
代码
#include<bits/stdc++.h>
#define maxn 500010
#define linf (1ll<<60)
#define iinf 0x3f3f3f3f
#define eps 1e-8
#define cl(x) memset(x,0,sizeof(x))
#define mod 1000000007ll
using namespace std;
typedef long long ll;
ll read(ll x=0)
{
int c, f=1;
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return f*x;
}
ll n, m, k, a[maxn], f[maxn], c[maxn], s[maxn];
int main()
{
ll i, j, x, y;
n=read(), m=read(), k=read();
for(i=1;i<=n;i++)a[i]=read();
sort(a+1,a+n+1);
for(i=1;i<=k;i++)s[i]=s[i-1]+a[i];
for(i=1;i<=k;i++)c[i]=i;
for(i=1;i<=m;i++)
{
x=read(), y=read();
if(x<=k)c[x]=min(c[x],x-y);
}
for(i=1;i<=k;i++)
{
f[i]=linf;
for(j=1;j<=i;j++)
{
f[i]=min(f[i],f[i-j]+(s[i]-s[i-c[j]]));
}
}
cout<<f[k];
return 0;
}