题意:有n组客人,分别告诉每一组的个数和花费,然后给你餐厅内k个桌子,每个桌子的最大容纳人数,如何安排使得餐厅最大收益并且容纳人数尽可能大;
思路:贪心,对花费排序,然后对每一组客人找桌子就可以。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 2000 5 using namespace std; 6 struct node 7 { 8 int c,p,id; 9 bool operator <(const node &a)const 10 { 11 return (p>a.p)||(p==a.p&&c>a.c); 12 } 13 }q[maxn]; 14 struct node1 15 { 16 int x,id; 17 bool operator <(const node1 &a)const 18 { 19 return x<a.x; 20 } 21 }p[maxn],pp[maxn]; 22 bool vis[maxn]; 23 int num[maxn]; 24 25 int main() 26 { 27 int n,k; 28 scanf("%d",&n); 29 for(int i=0; i<n; i++) 30 { 31 scanf("%d%d",&q[i].c,&q[i].p); 32 q[i].id=i+1; 33 } 34 sort(q,q+n); 35 scanf("%d",&k); 36 for(int i=1; i<=k; i++) 37 { 38 scanf("%d",&p[i].x); 39 p[i].id=i; 40 } 41 sort(p+1,p+k+1); 42 memset(vis,false,sizeof(vis)); 43 int ans=0,cnt=0; 44 for(int i=0; i<n; i++) 45 { 46 for(int j=1; j<=k; j++) 47 { 48 if(p[j].x>=q[i].c&&!vis[p[j].id]) 49 { 50 pp[cnt].x=q[i].id; 51 pp[cnt++].id=p[j].id; 52 ans+=q[i].p; 53 vis[p[j].id]=true; 54 break; 55 } 56 } 57 } 58 printf("%d %d\n",cnt,ans); 59 for(int i=0; i<cnt; i++) 60 { 61 printf("%d %d\n",pp[i].x,pp[i].id); 62 } 63 return 0; 64 }