####题解
因为每个球所占的位置都是1,所以只要贪心就好了,分数最大的球能取就取。
####代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
struct Bottle{int sze,lim;} b[101000];
int a[101000],n,m,cnt,sum;
inline int read()
{
int ret=0,f=1;char ch=getchar();
for (;!isdigit(ch);ch=getchar()) if (ch=='-') f=-1;
for (;isdigit(ch);ch=getchar()) ret=ret*10+ch-'0';
return ret;
}
void init(){cnt=0;sum=0;memset(a,0,sizeof(a));memset(b,0,sizeof(b));}
bool cmp1(int x,int y){return x>y;}
bool cmp2(Bottle x,Bottle y){return x.lim==y.lim?x.sze<y.sze:x.lim<y.lim;}
int main()
{
for (scanf("%d %d",&n,&m);(n!=0)||(m!=0);scanf("%d %d",&n,&m))
{
init();
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<=m;i++) b[i].sze=read(),b[i].lim=read();
sort(a+1,a+1+n,cmp1);sort(b+1,b+1+m,cmp2);
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
if (!b[j].sze||b[j].lim<a[i]) continue;
cnt++;sum+=a[i];b[j].sze--;break;
}
}
printf("%d %d\n",cnt,sum);
}
return 0;
}