WA0 求条,不知是思路有问题还是代码实现有问题

题面:

题目描述
有一家餐馆有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;
}

@王建力 @严志刚 @2345安全卫士 @稻叶昙 @王老师 把我知道的都叫过来

感觉像贪心的题,我思路是按人数排序大到小,局部推每个桌子的最大收益

设桌子数组 a ,人群数组 b ,有 b_1.c \sim b_j.c 均满足 \ge a_i 的条件,取 max(b_1.p \sim b_r.p) 为这个桌子的最大收益(标记之前取过的最大值,这次不取)

所以可以用两个 for ,外层枚举 i ,内层枚举 j ,每次取的最大值标记之后不取

然后把所有收益加起来

@王钰宸涵

@稻叶昙 ok,谢谢我试试

我有,和我私聊