题目链接: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;
}