其实就是一个简单的贪心排序,不过还可以换一种思路,拿数组来存储状态,可以使算法优化到线性时间复杂度
贪心:
/*
ID: ljracm1
LANG: C++
PROB: milk
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#define T
using namespace std;
struct Item{
int p;
int a;
};
bool cmp(Item A,Item B){
return A.p<B.p;
}
int main(){
#ifdef T
freopen("milk.in","r",stdin);
freopen("milk.out","w",stdout);
#endif
int N,M;
cin>>N>>M;
Item *f = new Item[M+2];
for(int i=0; i<M; i++)
cin>>f[i].p>>f[i].a;
sort(f,f+M,cmp);
int res=0;
for(int i=0; i<M&&N; i++){
if(f[i].a<=N){
N-=f[i].a;
res += f[i].a*f[i].p;
}
else{
res += f[i].p*N;
N=0;
}
}
cout<<res<<endl;
return 0;
}
线性版本:
/*
ID: ljracm1
LANG: C++
PROB: milk
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#define T
using namespace std;
int s[1002];
int main(){
#ifdef T
freopen("milk.in","r",stdin);
freopen("milk.out","w",stdout);
#endif
int n,m,p,a;
cin>>n>>m;
for(int i=0; i<m; i++){
cin>>p>>a;
s[p]+=a;
}
int res = 0;
for(int i=0; i<=1000&&n; i++){
if(s[i]!=0){
if(n>=s[i]){ n-=s[i]; res+=s[i]*i; }
else{ res+=n*i; n=0; }
}
}
cout<<res<<endl;
return 0;
}