题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1084

解题思路:直接暴力也可以,不过暴力也是可以讲技巧的。因为原题按输入的顺序输出,所以先将需要读入的数据存两份。然后对其中一个按照题目所给规则排序。然后根据邻接表的思想将解题数5 4 3 2 1 0 的人分开存放。最后遍历没有排序的数组,到存放对应的解题数的vector中查找所在位置,判断得分。

code:

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm> 

using namespace std;

struct node{
	int score;
	int h, m, s;
};
struct node a[107], b[107];

bool cmp(node a1, node a2)		// 自定义排序规则 
{
	if(a1.score == a2.score)
	{
		if(a1.h != a2.h)
			return a1.h < a2.h;
		else if(a1.m != a2.m)
			return a1.m < a2.m;
		else
			return a1.s < a2.s; 
	}
	return a1.score > a2.score;
}

struct vnode{
	int vh, vm, vs;
} e;
vector<vnode> v[6]; 

bool check(node ac)	// 查询结点所在位置,前半部分返回true否则返回false 
{
	int len = v[ac.score].size();	// 做题数相同的人的个数 
	for(int i=0; i<len; i++)
	{
		if(ac.h == v[ac.score][i].vh && ac.m == v[ac.score][i].vm && ac.s == v[ac.score][i].vs)
		{
			if(i+1 <= len / 2)
				return true;
			else
				return false;
		}
	}
	return false;
}

int main()
{
	int n;
	while(scanf("%d", &n), n > 0)
	{
		for(int i=0; i<6; i++)
			v[i].clear();
		for(int i=0; i<n; i++)
		{
			scanf("%d %d:%d:%d", &a[i].score, &a[i].h, &a[i].m, &a[i].s);
			b[i].score = a[i].score;
			b[i].h = a[i].h;
			b[i].m = a[i].m;
			b[i].s = a[i].s;
		}
		sort(a, a+n, cmp);
		for(int i=0; i<n; i++)
		{
			e.vh = a[i].h;
			e.vm = a[i].m;
			e.vs = a[i].s;
			v[a[i].score].push_back(e);	// 将做题数 5 4 3 2 1 0的人分开存放 
		}
		for(int i=0; i<n; i++)
		{
			if(b[i].score == 5)
				printf("100\n");
			else if(b[i].score == 4)
			{
				if(check(b[i]))
					printf("95\n");
				else
					printf("90\n");
			}
			else if(b[i].score == 3)
			{
				if(check(b[i]))
					printf("85\n");
				else
					printf("80\n"); 
			}
			else if(b[i].score == 2)
			{
				if(check(b[i]))
					printf("75\n");
				else
					printf("70\n");
			}
			else if(b[i].score == 1)
			{
				if(check(b[i]))
					printf("65\n");
				else
					printf("60\n");
			}
			else
				printf("50\n");
		} 
		printf("\n");
	}
	
	
	
	return 0;
}