贪心
从小桌子开始每一步都选择符合条件的最大收益
#include<bits/stdc++.h>
using namespace std;
struct CP
{
int c;
int p;
int num;
int via;
}cp[1020];
struct KK
{
int r;
int num;
}K[1020];
bool cmp1(CP a,CP b)
{
return a.c<b.c;
}
bool cmp2(KK a,KK b)
{
return a.r<b.r;
}
int main()
{
int n,k;
int flag[1020];
memset(flag,0,sizeof(flag));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&cp[i].c,&cp[i].p);
cp[i].num=i;
}
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
scanf("%d",&K[i].r);
K[i].num=i;
}
sort(cp+1,cp+n+1,cmp1);
sort(K+1,K+k+1,cmp2);
int s=0,m=0;
for(int i=1;i<=k;i++)
{
int maxp=0,maxn=0;
for(int j=1;j<=n;j++)
{
if(flag[j]==0&&cp[j].c<=K[i].r&&cp[j].p>maxp)
{
maxp=cp[j].p;
maxn=j;
}
if(cp[j].c>K[i].r)
break;
}
if(maxp!=0)
{
s+=maxp;
flag[maxn]=1;
cp[maxn].via=K[i].num;
m++;
}
}
printf("%d %d\n",m,s);
for(int i=1;i<=n;i++)
{
if(flag[i]==1)
printf("%d %d\n",cp[i].num,cp[i].via);
}
return 0;
}