题目描述
所谓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的三个成绩 所以错误!