求助~~不知道哪错了,请帮帮忙,谢谢。

时间:2022-09-05 21:43:49
题目:
MM Programming Club
Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 326    Accepted Submission(s): 86


Problem Description
ACM is popular in HDU. Many girls want to learn more about programming skills in ACM. As one of assistances of Lcy, Yifenfei is now busy preparing a new club called “MM Programming Club”. Of Course, He will be the leader of the club, and teach these girls patiently. After the news posted around the campus, as many as N girls are determined to take part in the club. However, the numbers of members are limited; Yifenfei will only select K of them. It is quite a difficult problem. Here is a list of all information about N girls. Each of them has intelligence value and prettiness value. He also wants these K members such that the difference of intelligence between any two of them must not be greater than MAXK (If K = 1, the difference is zero). Now he wants to maximize the Sum of these K girls’ prettiness value.
 

Input
Many test case, please process to end of file. Each test first contains three integers N(1 <= N <= 200), K(1 <= K <= N), MAXK(1 <= MAXK <= 500). Then N lines follow. Each line contains two integers S, T (1 <= S, T <= 500). S represents the intelligence value, and T represents the prettiness value.
 

Output
If he can’t succeed in selecting K girls, print “-1”. Otherwise, Print the maximum the Sum of these K girls’ prettiness value.
 

Sample Input
2 1 0
1 2
2 3
2 2 0
1 2
2 3
2 2 1
1 2
2 3
 

Sample Output
3
-1
5
我的代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

struct node
{
int a,b;
}e[205];
bool cmp(const node &x,const node &y)
{
if(x.b!=y.b) return x.b>y.b;
else return x.a>y.a;
}
int main()
{
int n,k,maxx,ans,temp,flag[205],flag1;
int i,j,m,p;
while(scanf("%d %d %d",&n,&k,&maxx)!=EOF)
{
ans=0;
for(i=0;i<n;i++)
scanf("%d %d",&e[i].a,&e[i].b);
sort(e,e+n,cmp);
for(i=0;i<n;i++)
{
memset(flag,0,sizeof(flag));
temp=e[i].b;
flag[i]=1;
p=1;
if(p==k)
{
if(temp>ans) ans=temp;
break;
}
for(j=i+1;j<n;j++)
{
flag1=0;
for(m=0;m<n;m++)
if(flag[m]==1&&(e[m].a-e[j].a)>maxx) break;
if(m==n) flag1=1;
if(flag1==1)
{
temp+=e[j].b;
flag[j]=1;
p++;
}
if(p==k) 
{
if(temp>ans) ans=temp;
break;
}
}
}
if(ans==0) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}








5 个解决方案

#1


看不懂,帮顶!

#2


while(scanf("%d %d %d",&n,&k,&maxx)!=EOF)到这里我也不会了,不理解它的意思了,希望高手出现解决呀!!!

#3


Many test case, please process to end of file. Each test first contains three integers  N(1 <= N <= 200), K(1 <= K <= N), MAXK(1 <= MAXK <= 500). Then N lines follow. Each line contains two integers S, T (1 <= S, T <= 500). S represents the intelligence value, and T represents the prettiness value.
不是MAXK(1 <= MAXK <= 500)吗
Sample Input
2 1 0 怎么会是0 难道第三个值不是表示MAXK吗,还是我理解错误呀?

#4


引用 3 楼 apple_lover55 的回复:
Many test case, please process to end of file. Each test first contains three integers N(1 <= N <= 200), K(1 <= K <= N), MAXK(1 <= MAXK <= 500). Then N lines follow. Each line contains two integers S,……


小错误而已,可以是0。

#5


修改后的程序是这样的,不过超时了,还在修改中....
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

struct node
{
int a,b;
}e[205];
bool cmp(const node &x,const node &y)
{
if(x.b!=y.b) return x.b>y.b;
else return x.a>y.a;
}
int main()
{
int n,k,maxx,ans,temp,flag[205],flag1;
int i,j,m,p,r;
while(scanf("%d %d %d",&n,&k,&maxx)!=EOF)
{
ans=0;
for(i=0;i<n;i++)
scanf("%d %d",&e[i].a,&e[i].b);
sort(e,e+n,cmp);
for(i=0;i<n;i++)
{
memset(flag,0,sizeof(flag));
temp=e[i].b;
flag[i]=1;
p=1;
if(p==k)
{
if(temp>ans) ans=temp;
break;
}
for(r=1;r<n-i;r++)
{
memset(flag,0,sizeof(flag));
flag[i]=1;
p=1;
                temp=e[i].b;
for(j=i+r;j<n;j++)
{
flag1=0;
for(m=0;m<n;m++)
if(flag[m]==1&&(e[m].a-e[j].a)>maxx) break;
if(m==n) flag1=1;
if(flag1==1)
{
temp+=e[j].b;
flag[j]=1;
p++;
}
if(p==k) 
{
if(temp>ans) ans=temp;
break;
}
}
}
}
if(ans==0) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}








#1


看不懂,帮顶!

#2


while(scanf("%d %d %d",&n,&k,&maxx)!=EOF)到这里我也不会了,不理解它的意思了,希望高手出现解决呀!!!

#3


Many test case, please process to end of file. Each test first contains three integers  N(1 <= N <= 200), K(1 <= K <= N), MAXK(1 <= MAXK <= 500). Then N lines follow. Each line contains two integers S, T (1 <= S, T <= 500). S represents the intelligence value, and T represents the prettiness value.
不是MAXK(1 <= MAXK <= 500)吗
Sample Input
2 1 0 怎么会是0 难道第三个值不是表示MAXK吗,还是我理解错误呀?

#4


引用 3 楼 apple_lover55 的回复:
Many test case, please process to end of file. Each test first contains three integers N(1 <= N <= 200), K(1 <= K <= N), MAXK(1 <= MAXK <= 500). Then N lines follow. Each line contains two integers S,……


小错误而已,可以是0。

#5


修改后的程序是这样的,不过超时了,还在修改中....
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

struct node
{
int a,b;
}e[205];
bool cmp(const node &x,const node &y)
{
if(x.b!=y.b) return x.b>y.b;
else return x.a>y.a;
}
int main()
{
int n,k,maxx,ans,temp,flag[205],flag1;
int i,j,m,p,r;
while(scanf("%d %d %d",&n,&k,&maxx)!=EOF)
{
ans=0;
for(i=0;i<n;i++)
scanf("%d %d",&e[i].a,&e[i].b);
sort(e,e+n,cmp);
for(i=0;i<n;i++)
{
memset(flag,0,sizeof(flag));
temp=e[i].b;
flag[i]=1;
p=1;
if(p==k)
{
if(temp>ans) ans=temp;
break;
}
for(r=1;r<n-i;r++)
{
memset(flag,0,sizeof(flag));
flag[i]=1;
p=1;
                temp=e[i].b;
for(j=i+r;j<n;j++)
{
flag1=0;
for(m=0;m<n;m++)
if(flag[m]==1&&(e[m].a-e[j].a)>maxx) break;
if(m==n) flag1=1;
if(flag1==1)
{
temp+=e[j].b;
flag[j]=1;
p++;
}
if(p==k) 
{
if(temp>ans) ans=temp;
break;
}
}
}
}
if(ans==0) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}