HDU-1084 What Is Your Grade?

“Point, point, life of student!” 
This is a ballad(歌谣)well known in colleges, and you must care about your score in this exam too. How many points can you get? Now, I told you the rules which are used in this course. 
There are 5 problems in this final exam. And I will give you 100 points if you can solve all 5 problems; of course, it is fairly difficulty for many of you. If you can solve 4 problems, you can also get a high score 95 or 90 (you can get the former(前者) only when your rank is in the first half of all students who solve 4 problems). Analogically(以此类推), you can get 85、80、75、70、65、60. But you will not pass this exam if you solve nothing problem, and I will mark your score with 50. 
Note, only 1 student will get the score 95 when 3 students have solved 4 problems. 
I wish you all can pass the exam! 
Come on! 

Input

Input contains multiple test cases. Each test case contains an integer N (1<=N<=100, the number of students) in a line first, and then N lines follow. Each line contains P (0<=P<=5 number of problems that have been solved) and T(consumed time). You can assume that all data are different when 0<p. 
A test case starting with a negative integer terminates the input and this test case should not to be processed. 

Output

Output the scores of N students in N lines for each case, and there is a blank line after each case. 

Sample Input

4
5 06:30:17
4 07:31:27
4 08:12:12
4 05:23:13
1
5 06:30:17
-1

Sample Output

100
90
90
95

100

解题思路:这道题就是使用sort+结构体就可以了

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=110;
struct node{
	char time[20];
	int num;//解题数 
	int id;//输入学生的顺序 
	int rank;//学生在当前解题数的排名,用时越短排名越靠前, 
	int score;//学生的成绩 
}a[maxn];
bool cmp(node a,node b)//按解题数从大到小排序,解题数相同时,按用时从小到大排序, 
{
	if(a.num==b.num)
		return strcmp(a.time,b.time)<0;
	return a.num>b.num;
}
bool cmp1(node a,node b)//按学生输入顺序排序 
{
	return a.id<b.id;
}
int main()
{
	int n;
	while(cin>>n)
	{
		if(n<=0)
			break;
		int c[6]={0};//储存解题数为n时的人数n= 0 1 2 3 4 5,初始化为0 
		for(int i=0;i<n;i++)
		{
			cin>>a[i].num>>a[i].time;
			a[i].id=i;
			
		}
		sort(a,a+n,cmp);
		for(int i=0;i<n;i++)
		{
			a[i].rank=++c[a[i].num];//排名当前解题数为a[i].num学生中的排名, 
		}
		for(int i=0;i<6;i++)
		{
			c[i]/=2;//计算解题数为i的前一半的人数为多少 
		}
		for(int i=0;i<n;i++)//计算成绩 
		{
			if(a[i].num==5)
				a[i].score=100;
			else if(a[i].num==4)
			{
				if(a[i].rank<=c[a[i].num])
					a[i].score=95;
				else
					a[i].score=90;
			}
			else if(a[i].num==3)
			{
				if(a[i].rank<=c[a[i].num])
					a[i].score=85;
				else
					a[i].score=80;
			}
			else if(a[i].num==2)
			{
				if(a[i].rank<=c[a[i].num])
					a[i].score=75;
				else
					a[i].score=70;
			}
			else if(a[i].num==1)
			{
				if(a[i].rank<=c[a[i].num])
					a[i].score=65;
				else
					a[i].score=60;
			}
			else
				a[i].score=50;
		}
		sort(a,a+n,cmp1);
		for(int i=0;i<n;i++)
		{
			cout<<a[i].score<<endl;
		}
		cout<<endl;
	}
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/qq_40707370/article/details/82155264
今日推荐