HPUOJ---2017寒假作业--专题0/H-What Is Your Grade(switch语句)

H - 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
思路:题目说的很清楚,0道50分,5道100分,1道至4道,根据提交时间 ,同样的题数,前半部分比后半部分
多五分。 
代码一:自己的思路(很烂很菜的)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct stu
{
	int n;
	char time[10];
	int turn;
	int k;
	int p; 
 } data[100+25];
 bool cmp1(stu A,stu B)
 {
 	if(A.n==B.n)
 	{
 		return strcmp(A.time,B.time)<0;
	}                     //字符串排序就应该这样,一定要记清楚了 
	 return A.n>B.n;
 }
 bool cmp2(stu A,stu B)
 {
 	return A.turn<B.turn;
 }
 int main()
 {
 	int N,i,k[100+25],a,b,c,d,j,m;
 	while(scanf("%d",&N),N>=0)
 	{
 		a=1,b=1,c=1,d=1,j=-1;
 		for(i=0;i<N;i++)
 		{
 			scanf("%d %s",&data[i].n,data[i].time);
 			data[i].turn=i;
		}
		sort(data,data+N,cmp1);
	    for(i=0;i<N;i++)
		{
		 	if(data[i].n==5)
		 	{
		 	    data[i].k=100;
		 	    j=i;
		    }
		 	else if(data[i].n==data[i+1].n&&data[i].n==4)
		 		a++;
		 	else if(data[i].n==data[i+1].n&&data[i].n==3)
		 	    b++;
		 	else if(data[i].n==data[i+1].n&&data[i].n==2)
		 	    c++;
		 	else if(data[i].n==data[i+1].n&&data[i].n==1)
		 	    d++;
		 	else
		 	    data[i].k=50;
		}
		m=j+1;
		for(i=m;i<m+a/2;i++)
	 	    data[i].k=95;
		for(i=m+a/2;i<m+a;i++)
		 	data[i].k=90;
		for(i=m+a;i<m+a+b/2;i++)
		 	data[i].k=85;
		for(i=m+a+b/2;i<m+a+b;i++)
		    data[i].k=80;
		for(i=m+a+b;i<m+a+b+c/2;i++)
	 	    data[i].k=75;
		for(i=m+a+b+c/2;i<m+a+b+c;i++)
		    data[i].k=70;
		for(i=m+a+b+c;i<m+a+b+c+d/2;i++)
		    data[i].k=65;
		for(i=m+a+b+c+d/2;i<m+a+b+c+d;i++)
		 	data[i].k=60;
		for(i=0;i<N;i++)
		    data[i].p=data[i].k; 
		sort(data,data+N,cmp2);	//因为要按原顺序输出,所以把已经被打乱的顺序重新再排 
		for(i=0;i<N;i++)
			printf("%d\n",data[i].p);
		printf("\n");
	 }
	 return 0;
 }
代码二:借鉴某大神的思路。switch语句,很厉害。
 
  
#include<cstdio>
#include<cstring> 
#include<algorithm>
using namespace std;
struct stu
{
	int n;
	char time[10];
	int turn;
	int k;
}data[100+12];
bool cmp1(stu A,stu B)
{
	if(A.n==B.n)
	   return strcmp(A.time,B.time)<0;
	return A.n>B.n; 
}
bool cmp2(stu A,stu B)
{
	return A.turn<B.turn;                              //最后要按原序输出 ,将顺序排列,最后回归原序
}
int main()
{
	int N,i,p[100+10],a;                       //用a来代表同样题数提交的顺序(厉害)
	while(scanf("%d",&N),N>=0)
	{
		a=0;
		memset(p,0,sizeof(p));
		for(i=0;i<N;i++)
		{
			scanf("%d %s",&data[i].n,data[i].time);
			data[i].turn=i;
			p[data[i].n]++;//用这个方法来计算统计做对某一题数的人数,更加方便,不易想到 //
		}
		for(i=0;i<N;i++)
		{
			switch(data[i].n)
			{
				case 0:data[i].k=50;break;
				case 1:data[i].k=60;break;
				case 2:data[i].k=70;break;
				case 3:data[i].k=80;break;
				case 4:data[i].k=90;break;
				case 5:data[i].k=100;break; 
			}
			if(data[i].n>0&&data[i].n<5)
			{
				if(p[data[i].n]<=1||a<p[data[i].n]/2)                  //这一点很不容易想到啊 //
				{
					data[i].k+=5;
					a++;                             //前几个的分数较高,那咋办呢,不用你再那样都算开,直接引入一个新的变量就可以了,// 
				}
				if(data[i].n!=data[i+1].n)                     //和下面的不一样了就要归0了,进入下一个 //
				    a=0;
			}
		}
		sort(data,data+N,cmp2);
		for(i=1;i<N;i++)
		   printf("%d\n",data[i].k);
		printf("\n");
	}
	return 0;                            
}


 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值