2465: [中山市选2009]小球
代码
1 /* 2 开始时理解错题了,以为一个瓶子的容量是最大容纳多少的分数。。。理解的偏差的太远了吧! 3 瓶子的容量是能容下多少球,瓶子的分数上界是球的分数最大的是多少。于是一个球放分大的放分小的占用的容量都是1,所以把球按分数排序,从分数上界大的瓶子顺序往分数上界小的瓶子里放。 4 */ 5 #include<bits/stdc++.h> 6 using namespace std; 7 typedef long long LL; 8 9 inline int read() { 10 int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; 11 for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f; 12 } 13 14 #define pa pair<int,int> 15 #define mp(a,b) make_pair(a,b) 16 17 int a[1100]; 18 pa b[1010]; 19 20 int main() { 21 int n,m; 22 while (scanf("%d%d",&n,&m)!=EOF) { 23 if (!n && !m) break; 24 for (int i=1; i<=n; ++i) a[i] = read(); 25 sort(a+1,a+n+1); 26 for (int i=1; i<=m; ++i) b[i].second = read(),b[i].first = read(); 27 sort(b+1,b+m+1); 28 29 int now = n,ans1 = 0,ans2 = 0; 30 for (int i=m; i>=1; --i) { 31 while (now && a[now]>b[i].first) now--; 32 while (now && b[i].second) ans1++,ans2 += a[now],b[i].second --,now--; 33 } 34 printf("%d %d ",ans1,ans2); 35 } 36 return 0; 37 }