SDNU 1281.谁是第一名 水题 结构体排序 注意名字比较
2017-02-24 00:48
148 查看
1281.谁是第一名
Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 210 Accepted Submission(s): 44
Description
小明期末考试要考高数、计算机基础、英语三门学科,每科得分都是百分制,最后有个按照总分的排名,请你帮他算出他们班的第一名是谁。(总分=计算机基础*60%+高数*30%+英语*30%)如果若干人总分相同,则再按照计算机基础分高低取第一,如果还相同,再看数学...再看英语...如果三门成绩完全一样,则他们并列第一并按照名字升序输出。
Input
第一行N,代表有N位同学参加排名,1≤N≤100
接下来的N行表示每一名同学的成绩,每一行首先是同学的名称,之后是该同学的成绩(计算机基础 高数 英语)。联系人的姓名不会超过50个字符,只包含英文大写字母。成绩均为百分制。
Output
输出第一名,若成绩完全一样,按照姓名升序输出,每行一个名字
Sample Input
4
SQC 90 60 79
HC 60 90 90
ZJQ 80 85 92
RDJ 66 87 79
Sample Output
ZJQ
其实这题并没什么好写的,不过因为一点小问题一直在WA= =所以写出来提醒自己一下吧。
顺便,开学了不能再那么难懒了......存了一堆题了都还没写感觉当时的想法都忘的差不多了,该好好补补了,就以一道水题开个头吧。
给出一些条件然后排序,排出第一名输出,如果有几个人并列第一,则按名字排序,然后,就是这里出问题了,一开始我直接写的a.name<b.name.....结果就因为这里一直在WA,忽略了名字长度可能不同的问题...
下面AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct person
{
char name[55];
int math,eng,com;
double sum;
};
person p[105];
int cmp(person a,person b)
{
int i;
int len=max(strlen(a.name),strlen(b.name));
if(a.sum!=b.sum)
return a.sum>b.sum;
if(a.com!=b.com)
return a.com>b.com;
if(a.math!=b.math)
return a.math>b.math;
if(a.eng!=b.eng)
return a.eng>b.eng;
for(i=0;i<len;i++)
{
if(a.name[i]!=b.name[i])
return a.name[i]<b.name[i];
}
}
int main()
{
int n;
int i;
while(scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p));
for(i=0;i<n;i++)
{
scanf("%s",p[i].name);
scanf("%d%d%d",&p[i].com,&p[i].math,&p[i].eng);
p[i].sum=p[i].com*0.6+p[i].math*0.3+p[i].eng*0.3;
}
sort(p,p+n,cmp);
cout<<p[0].name<<endl;
for(i=1;i<n;i++)
{
if(p[0].sum==p[i].sum&&p[0].com==p[i].com&&p[0].math==p[i].math&&p[0].eng==p[i].eng)
cout<<p[i].name<<endl;
else
break;
}
}
return 0;
}
Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 210 Accepted Submission(s): 44
Description
小明期末考试要考高数、计算机基础、英语三门学科,每科得分都是百分制,最后有个按照总分的排名,请你帮他算出他们班的第一名是谁。(总分=计算机基础*60%+高数*30%+英语*30%)如果若干人总分相同,则再按照计算机基础分高低取第一,如果还相同,再看数学...再看英语...如果三门成绩完全一样,则他们并列第一并按照名字升序输出。
Input
第一行N,代表有N位同学参加排名,1≤N≤100
接下来的N行表示每一名同学的成绩,每一行首先是同学的名称,之后是该同学的成绩(计算机基础 高数 英语)。联系人的姓名不会超过50个字符,只包含英文大写字母。成绩均为百分制。
Output
输出第一名,若成绩完全一样,按照姓名升序输出,每行一个名字
Sample Input
4
SQC 90 60 79
HC 60 90 90
ZJQ 80 85 92
RDJ 66 87 79
Sample Output
ZJQ
其实这题并没什么好写的,不过因为一点小问题一直在WA= =所以写出来提醒自己一下吧。
顺便,开学了不能再那么难懒了......存了一堆题了都还没写感觉当时的想法都忘的差不多了,该好好补补了,就以一道水题开个头吧。
给出一些条件然后排序,排出第一名输出,如果有几个人并列第一,则按名字排序,然后,就是这里出问题了,一开始我直接写的a.name<b.name.....结果就因为这里一直在WA,忽略了名字长度可能不同的问题...
下面AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct person
{
char name[55];
int math,eng,com;
double sum;
};
person p[105];
int cmp(person a,person b)
{
int i;
int len=max(strlen(a.name),strlen(b.name));
if(a.sum!=b.sum)
return a.sum>b.sum;
if(a.com!=b.com)
return a.com>b.com;
if(a.math!=b.math)
return a.math>b.math;
if(a.eng!=b.eng)
return a.eng>b.eng;
for(i=0;i<len;i++)
{
if(a.name[i]!=b.name[i])
return a.name[i]<b.name[i];
}
}
int main()
{
int n;
int i;
while(scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p));
for(i=0;i<n;i++)
{
scanf("%s",p[i].name);
scanf("%d%d%d",&p[i].com,&p[i].math,&p[i].eng);
p[i].sum=p[i].com*0.6+p[i].math*0.3+p[i].eng*0.3;
}
sort(p,p+n,cmp);
cout<<p[0].name<<endl;
for(i=1;i<n;i++)
{
if(p[0].sum==p[i].sum&&p[0].com==p[i].com&&p[0].math==p[i].math&&p[0].eng==p[i].eng)
cout<<p[i].name<<endl;
else
break;
}
}
return 0;
}
相关文章推荐
- HDU 2093 水题,就是注意一下细节,有个结构体的排序,重载运算符小于
- 艾伟_转载:数组排序方法的性能比较(上):注意事项及试验
- SDNU_ICPC1115(结构体排序)
- 数组排序方法的性能比较(1):注意事项及试验
- 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
- 数组排序方法的性能比较(上):注意事项及试验
- 拼音 名字 排序 a-z的比较 ( sortUsingComparator )
- HDU 1.3.7 (排序比较即可|水题)
- HDU1234_开门人和关门人【结构体排序】【水题】
- SDNU_ICPC1028(结构体排序)
- BToj 1031问题 B: KACA的数字排序 【大数比较--结构体sort && java大数比较】
- 利用名字排序(结构体和指针)
- 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
- C++ vector的排序------对于结构体vector, 需要自己实现比较
- FatMouse' Trade(水题,结构体排序,适合c初学者)
- 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
- 对结构体的按字符串名字进行排序
- 学生结构体数组,按成绩排序、按年 龄排序,按名字排序...如何实现?
- 数组排序方法的性能比较(1):注意事项及试验
- ACMSTEP 1.3.4 百步穿杨 //水题 结构体排序