hdu 1084 What Is Your Grade?(标记数据)

What Is Your Grade?


Problem Description
“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



这道题看起来不难,但是操作起来有很多值得留意的地方(对于现在我这种新手来说能学到很多东西),不过写得比较累赘,如果测试数据多一点可能就会超时了。



#include <iostream>
#include <algorithm> 
using namespace std;

void bsort (int a[], int sec[], int e[], int k);
void so(int a[], int b[], int k);

int main() 
{
	int n;
	while(cin >> n && n != -1) {
		int i = 0;
		int num[105]={}, th[105]={}, rank[105]={};
		int tm[105] = {}, ts[105]={};
		char a, b;
		while(n--) {
			cin >> num[i] >> th[i] >> a >> tm[i] >> b >> ts[i];
			rank[i] = i;//标记原始位置 
			i++;
		}
		int sec[105];
		for(int k = 0;k < i;k++) {
			sec[k] = th[k] * 3600 + tm[k] * 60 + ts[k];
		}//时间化为秒来算 
		bsort(num, sec, rank, i);//对题数进行排序,题数相等时对时间大小进行排序,都是降序排序,即第一位最大. 
		int grade[105]={}, regrade[105]={}, sec2[105]={};
		int sec4[105]={}, sec3[105]={}, tmp1[105]={},sec1[105]={};
		int tmp2[105] = {},tmp3[105]={},tmp4[105]={};
		int i4 = 0, i3 = 0, i2 = 0, i1 = 0;
		for(int k=0; k < i; k++) {//先对同题数的进行分组 
			if(num[k] == 5) grade[k] = 100;
			if(num[k] == 4) {
				grade[k] = 90;
				sec4[i4] = sec[k];
				tmp4[i4] = k;//下面的这个操作是记录这个秒数在原始排序中的位置 
				i4++;
			}
			if(num[k] == 3) {
				grade[k] = 80;
				sec3[i3] = sec[k];
				tmp3[i3] = k;
				i3++;
			}
			if(num[k] == 2) {
				grade[k] = 70;
				sec2[i2] = sec[k];
				tmp2[i2] = k;
				i2++;
			}
			if(num[k] == 1) {
				grade[k] = 60;
				sec1[i1] = sec[k];
				tmp1[i1] = k;
				i1++;
			}
			if(num[k] == 0) grade[k] = 50;
		}
		so(sec4, tmp4, i4);//每一组都进行升序排序,第一位就是用的秒数最小的数据。 
		so(sec3, tmp3, i3);
		so(sec2, tmp2, i2);
		so(sec1, tmp1, i1);
		for(int k = 0; k < i4/2; k++) {
			grade[tmp4[k]] = 95;//前1/2可以变为95,且是将总排序中对应位置的成绩进行替换。 
		}
		for(int k = 0; k < i3/2; k++) {
			grade[tmp3[k]] = 85;//同理 
		}
		for(int k = 0; k < i2/2; k++) {
			grade[tmp2[k]] = 75;
		}
		for(int k = 0; k < i1/2; k++) {
			grade[tmp1[k]] = 65;
		}
		for(int k = 0; k < i; k++) {//k为原始数据的位置,k=0时,输出rank值为0的数据,通过循环在总排序中进行查找。 
			for(int p = 0; p < i; p++) {
				if(rank[p] == k){
					cout << grade[p] << endl;
					p = 0;//重置p,从头开始找起。 
					break;
				}
			}
		}
		cout << endl;
	}
}



void bsort (int a[], int sec[], int e[], int k)
{
	for(int t = 0; t < k - 1; t++)
		for(int x=0; x < k - 1 - t; x++) {
			if(a[x] < a[x+1]) {
				swap(a[x], a[x+1]);
				swap(sec[x], sec[x+1]);
				swap(e[x], e[x+1]);
			}
			else if(a[x] == a[x+1]){
				if(sec[x] < sec[x+1]) {
					swap(sec[x], sec[x+1]);
					swap(e[x], e[x+1]);
				}
			}
		}
}
void so(int a[], int b[], int k)
{
	for(int t = 0; t < k - 1; t++)
		for(int x=0; x < k - 1 - t; x++) {
			if(a[x] > a[x+1]) {
				swap(a[x], a[x+1]);
				swap(b[x], b[x+1]);
			}
		}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值