F--Mark的双薪

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");
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注