问题 : NO.1

题目描述

    所谓NO.1,就是所有成绩都排在第一的同学,我们假设每个人只有理科,文科,体育这三门课。

我们现在假设某门成绩并列第一,并列的人都是这门功课第一名,并且保证数据不会出现2个NO.1

现给定n个人的信息,输出第一名的名字。

输入

多组数据,输入文件第一行为一个整数T,代表测试数据数。 (T<50)

接下来T个测试数据。  

每个测试数据的的第一行为一个整数n(n<=100),接下来有n行,每行的格式如下: 

名字 理科成绩 文科成绩 体育成绩 (数值越高代表成绩越好).

名字长度不超过20,3个成绩的为正整型.

输出

对于每个测试数据,输出NO.1的名字,如果不存在第一名,就输出"NO NO.1".

样例输入

3
2
lvhao 2 2 2
xiaoshua 1 1 1
2
lvhao 4 4 4
xiaoshua 4 4 3
3
lvhao 3 4 5
xiaoshua 1 3 1
pan 4 1 5

样例输出

lvhao
lvhao
NO NO.1

正确做法

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
struct Stu {
	string name;
	int gr1, gr2, gr3;
}stu[100];
int main() {
	int T, n;
	cin >> T;
	while (T--) {
		cin >> n;
		for (int i = 0;i<n;i++) {
			cin >> stu[i].name >> stu[i].gr1 >> stu[i].gr2 >> stu[i].gr3;
		}
		int max1 = 0, max2 = 0, max3 = 0;
		for (int i = 0;i<n;i++) {
			if (stu[i].gr1>max1)
				max1 = stu[i].gr1;
			if (stu[i].gr2>max2)
				max2 = stu[i].gr2;
			if (stu[i].gr3>max3)
				max3 = stu[i].gr3;
		}
		bool flag = 1;
		for (int i = 0;i<n;i++) {
			if (stu[i].gr1 == max1&&stu[i].gr2 == max2&&stu[i].gr3 == max3) {
				cout << stu[i].name << endl;
				flag = 0;
				break;
			}
		}
		if (flag) {
			cout << "NO NO.1" << endl;
		}
 
	}
	return 0;
}

错误做法

#include<stdio.h>
struct student {
	char a[20];
	int l,w,t;
};
int main(){
	int i,j,n,m,flag=1;
	struct student s,max;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&m);
		for(j=1;j<=m;j++){
			scanf("%s%d%d%d",&s.a,&s.l,&s.w,&s.t);
			if(j==1) max=s;
			else{
				if(max.l<s.l||max.t<s.t||max.w<s.w) flag=0;
				if(s.l>=max.l&&s.t>=max.t&&s.w>=max.w) {
					max=s;
					flag=1;
				}
			}
		}
		if(flag==0) printf("NO NO.1\n");
		else printf("%s\n",max.a);
    }
	return 0;
}


错误处

	scanf("%s%d%d%d",&s.a,&s.l,&s.w,&s.t);
			if(j==1) max=s;
			else{
				if(max.l<s.l||max.t<s.t||max.w<s.w) flag=0;
				if(s.l>=max.l&&s.t>=max.t&&s.w>=max.w) {
					max=s;
					flag=1;
				}
			}

如 1  max.l=2 max.w=2 max.t=2

     2  s.l=4 s.w=1 s.t=2

     3  s.l=3 s.w=2 s.t=3

此时结果为

wf的三个成绩只是均大于xs的成绩 不确定是否均大于ds的三个成绩 所以错误!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值