F--Mark的双薪
时间: 1ms 内存:128M
描述:
程序员 Mark 编制的 PPYU 游戏终于上线。Mark 认为自己起早贪黑工作努力,工作量最高,于是要求项目经理给自己双倍薪水。项目经理允诺如果 Mark 在项目组中找到两个程序员,其工作量之和等于他自己的工作量,就给他双薪。请你帮助判断是否 Mark 能否得到双倍薪水。
输入:
第一行给出n(1<n<100),m,表示项目组里有 n 个程序员,Mark的工作量是 m。接下来的 2~n+1 行是 n 个程序员的姓名和工作量。其中任意两个程序员的工作量不会是一样的。
输出:
请你输出符合条件的两个程序员的名字,工作量小的在前面。如果有多组满足条件的数据,请每行输出一组,按第一个工作量升序输出。如果不存在满足条件的两个程序员,请输出Not Exist!
示例输入:
5 15
Lucy 1
Lily 4
Wanglei 11
Dongdong 7
Mingzi 2
示例输出:
Lily Wanglei
提示:
参考答案(内存最优[924]):
#include <stdio.h>
#include <string.h>
int main()
{
int n,m;
char a[100][50];
int b[100][2]={0};
int temp;
char temp1[50];
int i,j;
int peace=0;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
scanf("%d",&b[i][0]);
}
for(i=0;i<n-1;i++)
{
for(j=i;j<n;j++)
{
if(b[i][0]>b[j][0])
{
temp=b[i][0];
b[i][0]=b[j][0];
b[j][0]=temp;
strcpy(temp1,a[i]);
strcpy(a[i],a[j]);
strcpy(a[j],temp1);
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(m==b[i][0]+b[j][0] && (b[i][1]!=1 ||b[j][1]!=1))
{
printf("%s %s\n",a[i],a[j]);
b[i][1]=1;
b[j][1]=1;
peace=1;
}
}
}
if(peace==0)
printf("Not Exist!\n");
return 0;
}
参考答案(时间最优[0]):
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct Coder{
char name[30];
int work;
};
struct Coder coder[101];
int cmp(Coder c1,Coder c2)
{
if(c1.work!=c2.work)
return c1.work<c2.work;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s%d",coder[i].name,&coder[i].work);
sort(coder,coder+n,cmp);
bool flag=false;
int ahead=n-1,behind=0,curSum;
char name1[25],name2[25];
while(ahead>behind)
{
curSum=coder[ahead].work+coder[behind].work;
if(curSum==m)
{
printf("%s %s\n",coder[behind].name,coder[ahead].name);
ahead--;
behind++;
flag=true;
}
else if(curSum>m)
ahead--;
else behind++;
}
if(!flag) printf("Not Exist!\n");
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。