By Jalan
知识工具需求
数学
数据结构和算法
- 排序
语言
- sort函数,在编写cmp的时候可以只写所有返回1的情况,末尾跟个返回0
题干
900年前中国哲学家司马光写了个历史书,在其中谈论了人名的天赋和品德,在他的理论里,才德兼备是圣人,德超才是君子,都不好是愚人.才大于德是小人.
现在给才德分,分类.
输入条件
第一行3正整数N<=10^5是总人数,L>=60是下界高于L才算.H<100是高标准界.
下面N行格式:
ID_Number Virtue_Grade Talent_Grade
ID是8位数字,成绩[0,100]\
例1
14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60
输出条件
第一行打印M<=N是参与排序的总数
下面M行
都高于H是圣人.按总分非递增排序.
才比H低,德比H高是是君子,也总分非递增在圣人后面
两个都比H低但是德比才高是愚人.非递增在君子后面
剩下的都比L高的排在愚人后
先按总分非递增,总分一致按德分非递增,德分一致按ID升序
例1
12
10000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90
题解
第一次
思路
- 建立4个表,在输入的时候就进行区分.和统计总人数
- 输入完按规则排序每个表
- 输出总人数和每个表
预期时间复杂度
nlogn
编写用时
16分钟
代码
CPP
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
typedef struct node
{
int id;
int v;
int t;
} node;
int cmp(node a, node b)
{
if (a.t + a.v > b.t + b.v)
{
return 1;
}
else if (a.t + a.v == b.t + b.v)
{
if (a.v > b.v)
{
return 1;
}
else if (a.v == b.v)
{
if (a.id < b.id)
{
return 1;
}
}
}
return 0;
}
int main(int argc, char const *argv[])
{
//input&&process
int N, L, H;
scanf("%d%d%d", &N, &L, &H);
vector<node> sages, nobleman, foolman, snob;
node temp;
int count = 0;
for (int i = 0; i < N; i++)
{
scanf("%d%d%d", &temp.id, &temp.v, &temp.t);
if (temp.v < L || temp.t < L)
{
continue;
}
++count;
if (temp.v >= H && temp.t >= H)
{
sages.push_back(temp);
}
else if (temp.v >= H)
{
nobleman.push_back(temp);
}
else if (temp.v >= temp.t)
{
foolman.push_back(temp);
}
else
{
snob.push_back(temp);
}
}
sort(sages.begin(), sages.end(), cmp);
sort(nobleman.begin(), nobleman.end(), cmp);
sort(foolman.begin(), foolman.end(), cmp);
sort(snob.begin(), snob.end(), cmp);
//output
printf("%d\n",count);
for (int i = 0; i < sages.size(); i++)
{
printf("%08d %d %d\n",sages[i].id,sages[i].v,sages[i].t);
}
for (int i = 0; i < nobleman.size(); i++)
{
printf("%08d %d %d\n", nobleman[i].id, nobleman[i].v, nobleman[i].t);
}
for (int i = 0; i < foolman.size(); i++)
{
printf("%08d %d %d\n", foolman[i].id, foolman[i].v, foolman[i].t);
}
for (int i = 0; i < snob.size(); i++)
{
printf("%08d %d %d\n", snob[i].id, snob[i].v, snob[i].t);
}
return 0;
}
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@
也欢迎关注我的CSDN账号呀,接下来两个月我应该会按这个格式更新所有的PTA甲级题目
**开心code每一天**