加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

排序基础题二

(2018-09-19 20:50:24)
分类: 排序
一)openjudge甲流病人初筛选
    目前正是甲流盛行时期,为了更好地进行分流治疗,医院在挂号时要求对病人的体温和咳嗽情况进行检查,对于体温超过37.5度(含等于37.5度)并且咳嗽的病人初步判定为甲流病人(初筛)。现需要统计某天前来挂号就诊的病人中有多少人被初筛为甲流病人。
输入
    第一行是某天前来挂号就诊的病人数n。(n < 200)
    其后有n行,每行是病人的信息,包括三个信息:姓名(字符串,不含空格,最多8个字符)、体温(float)、是否咳嗽(整数,1表示咳嗽,0表示不咳嗽)。每行三个信息之间以一个空格分开。
输出
    按输入顺序依次输出所有被筛选为甲流的病人的姓名,每个名字占一行。之后在输出一行,表示被筛选为甲流的病人数量。
样例输入
    5
    Zhang 38.3 0
    Li 37.5 1
    Wang 37.1 1
    Zhao 39.0 1
    Liu 38.2 1
样例输出
    Li
    Zhao
    Liu
    3

using namespace std;
struct man
{
     char name[100];
     float l;
     int s;
     int y;
 } m[201];
 //使用了未教的struct,不过这里确实适合用struct;

 int main()
 {
     int n;
     scanf("%d",&n);
     for(int i=1;i<=n;i++)
     {
         scanf("%s %f %d",m[i].name,&m[i].l,&m[i].s);
         if(m[i].l>=37.5 && m[i].s==1) m[i].y=1;
         else m[i].y=0;
     }
     int cnt=0;
     for(int i=1;i<=n;i++)
                if(m[i].y==1) printf("%s\n",m[i].name),cnt++;
     printf("%d",cnt);
     return 0;
}

二)openjudge病人排队
openjudge病人排队
描述
    病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
    1. 老年人(年龄 >= 60岁)比非老年人优先看病。
    2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
    3. 非老年人按登记的先后顺序看病。
输入
    第1行,输入一个小于100的正整数,表示病人的个数;
    后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
输出
    按排好的看病顺序输出病人的ID,每行一个。
样例输入
    5
    021075 40
    004003 15
    010158 67
    021033 75
    102012 30
样例输出
    021033
    010158
    021075
    004003
    102012
using namespace std;

struct per
{
    int num;
    string id;
    int age;
};
int score_comp(const per &a,const per &b)
{
    if((a.age>=60)||(b.age>=60))
    {
    if(a.age > b.age)return 1;
    if(a.age < b.age)return 0;
}
    if(a.num < b.num)return 1;
    return 0;
}

int main()
{
    int n;
    cin>>n;
    per a[100];
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].id>>a[i].age;
        a[i].num=i;
    }
    sort(a+1,a+(n+1),score_comp);
    for(int i=1;i<=n;i++)
    {
        cout<<a[i].id<<endl;
    }
}

三)openjudge分数线划定
    世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。
    现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。
输入
    第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。输入数据保证m*150%向下取整后小于等于n。
    第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000 ≤ k ≤ 9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。数据保证选手的报名号各不相同。
输出
    第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。
    从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
样例输入
    6 3
    1000 90
    3239 88
    2390 95
    7231 84
    1005 95
    1001 88
样例输出
    88 5
    1005 95
    2390 95
    1000 90
    1001 88
    3239 88
提示
    样例说明:m*150% = 3*150% = 4.5,向下取整后为4。保证4个人进入面试的分数线为88,但因为88有重分,所以所有成绩大于等于88的选手都可以进入面试,故最终有5个人进入面试。
using namespace std;
struct memb{
    int id;
    int code;
    };
memb b[10001];
bool comp(memb a,memb b){
    return  (a.code>b.code) || ((a.code==b.code) && a.id < b.id);
    }
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>b[i].id;
        cin>>b[i].code;   
        }
    sort(b+1,b+n+1,comp);
    int num    =(int)(m*1.5);//计划录取人数;
    int avr;
    if(num>=n) avr    =b[n].code;
    else             avr    =b[num].code;
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(b[i].code>=avr) cnt++;
        }
    cout<<avr<<" "<<cnt<<endl;
    for(int i=1;i<=cnt;i++){
        cout<<b[i].id<<" "<<b[i].code<<endl;
        }
    return 0;   
 

四)单词排序
    输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)
输入
    一行单词序列,最少1个单词,最多100个单词,每个单词长度不超过50,单词之间用至少1个空格间隔。数据不含除字母、空格外的其他字符。
输出
    按字典序输出这些单词,重复的单词只输出一次。
样例输入
    She  wants  to go to Peking University to study  Chinese
样例输出
    Chinese
    Peking
    She
    University
    go
    study
    to
    wants

五)出现次数超过一半的数   
给出一个含有n(0 < n <= 1000)个整数的数组,请找出其中出现次数超过一半的数。
    数组中的数大于-50且小于50。
输入
    第一行包含一个整数n,表示数组大小;
    第二行包含n个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开。
输出
    如果存在这样的数,输出这个数;否则输出no。
样例输入
    3
    1 2 2
样例输出
    2

六 )统计字符数
    给定一个由a-z这26个字符组成的字符串,统计其中哪个字符出现的次数最多。
输入
    输入包含一行,一个字符串,长度不超过1000。
输出
    输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格分开。如果有多个字符出现的次数相同且最多,那么输出ascii码最小的那一个字符。
样例输入
    abbccc
样例输出
    c 3

七)统计数字
    某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入
    包含n+1行:
    第一行是整数n,表示自然数的个数;
    第2~n+1每行一个自然数。

    40%的数据满足:1<=n<=1000;
    80%的数据满足:1<=n<=50000;
    100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*10^9)。
输出
    包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
样例输入
    8
    2
    4
    2
    4
    5
    100
    2
    100
样例输出
    2 3
    4 2
    5 1
    100 2
来源    NOIP2007复赛 提高组 第一题

八)归并排序 P122.5.1.1;
给出同为n个元素的A,B两个升序序列,请采归并排序,把它们合并成升序的C序列;
输入
第一行一个整数n;
第二行n个数的A序列;
第三行n个数的B序列
输出两者合并后的C序列
输入样例:
10
1 3 6 10 13 15 23 24 37 48
3 6 14 15 26 27 38 45 57 62
输出样例:
1 3 3 6 6 10 13 14 15 15 23 24 26 27 37 38 45 48 57 62

九)排序后格式化输出 P123.5.1.2
输入n个0到100之间的整数,由小到大排序输出,每个数占4格,每行输出5个;
输入 第一行一个n,第二行n个元素;
样例输入:
20
1 3 6 10 13 15 23 24 37 48 3 6 14 15 26 27 38 45 57 62
样例输出:
     10    13
15  23  24   37    48
   14   15    26
27  38  45   57    62

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有