原题:1062. Talent and Virtue (25)
解题思路:
按题目要求一步一步排序即可。
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 100000 +5;
struct Student
{
int id;
int talent, virtue, total;
} stu[maxn];
int n, l, h;
bool is_sage(Student a)
{
return a.talent >= h && a.virtue >= h;
}
bool is_noble(Student a)
{
return a.talent < h && a.talent >= l && a.virtue >= h;
}
bool is_fool(Student a)
{
return a.talent < h && a.talent >= l && a.virtue < h && a.virtue >= l&& a.virtue >= a.talent;
}
bool is_safe(Student a)
{
return a.talent >= l && a.virtue >= l;
}
bool cmp(Student a, Student b)
{
if(is_sage(a) && is_sage(b))
return a.total > b.total ||
(a.total == b.total && a.virtue > b.virtue) ||
(a.total == b.total && a.virtue == b.virtue && a.id < b.id);
else if(is_sage(a))
return true;
else if(is_sage(b))
return false;
else if(is_noble(a) && is_noble(b))
return a.total > b.total ||
(a.total == b.total && a.virtue > b.virtue) ||
(a.total == b.total && a.virtue == b.virtue && a.id < b.id);
else if(is_noble(a))
return true;
else if(is_noble(b))
return false;
else if(is_fool(a) && is_fool(b))
return a.total > b.total ||
(a.total == b.total && a.virtue > b.virtue) ||
(a.total == b.total && a.virtue == b.virtue && a.id < b.id);
else if(is_fool(a))
return true;
else if(is_fool(b))
return false;
else if(is_safe(a) && is_safe(b))
return a.total > b.total ||
(a.total == b.total && a.virtue > b.virtue) ||
(a.total == b.total && a.virtue == b.virtue && a.id < b.id);
else if(is_safe(a))
return true;
else if(is_safe(b))
return false;
else
return false;
}
int main()
{
while(scanf("%d%d%d", &n, &l, &h) == 3)
{
for(int i = 0; i < n; i++)
{
scanf("%d%d%d", &stu[i].id, &stu[i].virtue, &stu[i].talent);
stu[i].total = stu[i].talent + stu[i].virtue;
}
sort(stu, stu+n, cmp);
int cnt = 0;
for(int i = 0; i < n; i++)
{
if(!is_safe(stu[i])) break;
cnt++;
}
printf("%d\n", cnt);
for(int i = 0; i < cnt; i++)
printf("%08d %d %d\n", stu[i].id, stu[i].virtue, stu[i].talent);
}
return 0;
}