题面:
题目描述
有一家餐馆有k张桌子,第i张桌子最大可以坐下Ri个人。现在来了n伙顾客,第 i 群顾客共有Ci个人,将会带来收益Pi。每张桌子只能安排一群顾客,而且同一群顾客都要坐在一张桌子上。问接受哪几群顾客,并分别安排在哪几张桌子可以带来最大的收益。
输入格式
第一行包含一个整数n(1<=n<=1000)。
接下来有n行,每行有两个整数ci,pi。
接下来一行一个整数k(1<=k<=1000)。
最后一行包含k个整数r1..rk。
输出格式
输出一个数,表示最大的收益
样例输入
3
10 50
2 100
5 30
3
4 6 9
样例输出
130
时空限制
2s,512M
WA0 代码:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
I AK IOI;
struct node{
int c,p;
}a[1005];
int n,k,r[1005],s,sum=INT_MAX,ans,num;
bool f[1005],flag[1005];
bool cmp(node a,node b){
if(a.p==b.p)return a.c<b.c;
return a.p>b.p;
}
int main(){
//freopen("","r",stdin);
//freopen("","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].c>>a[i].p,num+=a[i].p;
cin>>k;
for(int i=1;i<=k;i++)cin>>r[i];
sort(&a[1],&a[n+1],cmp);
for(int i=1;i<=n;i++){
s=0;
sum=INT_MAX;
for(int j=1;j<=k;j++)if(!f[j]&&r[j]>=a[i].c&&r[j]<sum)s=j,sum=r[j];
if(!s)f[s]=1,flag[i]=1;
}
for(int i=1;i<=n;i++)if(flag[i])ans+=a[i].p;
cout<<ans;
i_ak ioi;
}
可是在输出中的 ans
改成 num-ans
就有 60 了,具体代码:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
I AK IOI;
struct node{
int c,p;
}a[1005];
int n,k,r[1005],s,sum=INT_MAX,ans,num;
bool f[1005],flag[1005];
bool cmp(node a,node b){
if(a.p==b.p)return a.c<b.c;
return a.p>b.p;
}
int main(){
//freopen("","r",stdin);
//freopen("","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].c>>a[i].p,num+=a[i].p;
cin>>k;
for(int i=1;i<=k;i++)cin>>r[i];
sort(&a[1],&a[n+1],cmp);
for(int i=1;i<=n;i++){
s=0;
sum=INT_MAX;
for(int j=1;j<=k;j++)if(!f[j]&&r[j]>=a[i].c&&r[j]<sum)s=j,sum=r[j];
if(!s)f[s]=1,flag[i]=1;
}
for(int i=1;i<=n;i++)if(flag[i])ans+=a[i].p;
cout<<num-ans;
i_ak ioi;
}