老和尚的导员

Problem:A

Time Limit:1000ms

Memory Limit:65536K

Description

等小和尚回来后,老和尚居然没有睡觉。老和尚表示他的导员的excel表格坏掉了(老和尚居然有导员?好吧……据说是方丈),而且老和尚的导员要老和尚将寺中所有和尚的期末考试成绩按降序排列来发奖学金(和尚还有奖学金?)
不用多说,为了继续睡午觉,这个任务理所当然的落在了小和尚身上。所有……你继续帮忙吧。

Input

寺中主要考试科目有C语言,线性代数,高等数学和英语四个科目(怎么当和尚都这么累),输入的第一行是和尚的人数N(N<=100),第二行至第N+1行分别为C语言a[i],线性代数b[i],高等数学c[i]和英语的成绩d[i](0 <= a[i],b[i],c[i],d[i] <= 100)。

Output

现需要你将和尚们的成绩以总成绩降序排列,输出数据的每行有两个数字,第一个数字为和尚的编号(输入时的第一个和尚成绩即为和尚1,第二个为和尚2),第二个数字为和尚的总成绩(如果总成绩相同,则按C语言的成绩排列,如在相同,则按线性代数输出编号,以此类推。)

Sample Input

5
98 50 27 65
58 52 24 16
98 96 90 89
31 65 98 78
65 67 66 90

Sample Output

3 373
5 288
4 272
1 240
2 150
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

struct data
{
    int c;
    int x;
    int g;
    int y;
    int z;
    int number;
}num[105];
bool cmp(data a,data b)
{
    if(a.z==b.z)
        return a.y>b.y;
        return a.z>b.z;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int i,j;
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d%d",&num[i].c,&num[i].x,&num[i].g,&num[i].y);
            num[i].z=num[i].c+num[i].x+num[i].g+num[i].y;
            num[i].number=i;
        }
        sort(num,num+105,cmp);
        for(j=0;j<n;j++)
        {
            printf("%d %d\n",num[j].number+1,num[j].z);
        }
    }
    return 0;
}

健忘的老和尚

Problem:B

Time Limit:1000ms

Memory Limit:65536K

Description

当小和尚排完名单后,老和尚突然一拍脑袋:“导员把每个人的人名都给我了,可我忘记告诉你了。”好吧……我们可怜的小和尚看来要费二遍事了(好像之前的任务都是你帮他做的,好吧,你真可怜)

Input

输入数据为多组,输入的第一行为和尚的人数N,可以得到奖学金的人数M,和需要补考的人数O(在这里可以满足M+O&lt;=N,即得到奖学金的和尚一定不用参加补考)。之后的N行每行都有一个字符串(即为和尚的名字,长度小于100)和尚考试的总分a[i](0 &lt;= a[i] &lt;= 1000)。

Output

前M行,每行是获得奖学金的小和尚的名字;
后O行,每行是补考的小和尚的名字;
由于老和尚觉得很对不起小和尚,所以他决定这次简单些,所以无论是奖励还是惩罚都按照总成绩从低到高输出和尚的名字即可。

Sample Input

5 1 2
a 192 
aa 212
ab 351
bab 128
bbaa 654

Sample Output

bbaa
bab
a

#include <stdio.h>
#include <algorithm>
using namespace std;
 struct in{
    char name[1000];
    int grade;
    };
bool cmp1(in a,in b)
{
    return a.grade>b.grade;
}
int main()
{
    int n,m,o;

    int a;

    while(scanf("%d %d %d",&n,&m,&o)!=EOF)
    {
        struct in stu[101];
        for(a=0;a<n;a++)
        {
            scanf("%s",&stu[a].name);
            scanf("%d",&stu[a].grade);
        }
        sort(stu,stu+n,cmp1);
        for(a=m-1;a>=0;a--)
            printf("%s\n",stu[a].name);
        for(a=n-1;a>n-o-1;a--)
            printf("%s\n",stu[a].name);

    }
    return 0;
}

相约摩洛哥

Problem:C

Time Limit:1000ms

Memory Limit:65536K

Description

2015年5月ACM全球总决赛在摩洛哥卡萨布兰卡举行,到时会有来自世界各地的acm大牛齐聚摩洛哥。
  
作为本次大赛的举办方负责人阿焜和阿祥被分配给了一个重要的任务,就是在比赛中统计大家的排名。
acm大赛排名规则(摘自百度百科):
    最后的获胜者为正确解答题目最多且总用时最少的队伍。每道试题用时将从竞赛开始到试题解答被判定为正确为止,其间每一次提交运行结果被判错误的话将被加罚20分钟时间,未正确解答的试题不记时。例如:A、B两队都正确完成两道题目,其中A队提交这两题的时间分别是比赛开始后1:00和2:45,B队为1:20和2:00,但B队有一题提交了2次。这样A队的总用时为1:00+2:45=3:45而B队为1:20+2:00+0:20=3:40,所以B队以总用时少而获胜。
请你帮他俩完成这项任务吧!(保证没有成绩完全相同两支队伍)

Input

多组输入,每组一个正整数n(1&lt;=n&lt;=100000),代表有n个队伍参赛。接下来的n行,每行分别有一个字符串(只包含小写英文字母)作为队伍名,长度1&lt;=len&lt;=10;ABC三道题的ac时间(以分钟为单位),时间为-1表示该题没有ac。接下来又有n行,表示每道题的提交次数,用3个正整数表示。

Output

输出排行榜。n行,每行一个队伍的名字、解题数和总用时。

Sample Input

3	
team 30 10 20
behappy 20 20 90
newbee 15 16 17
1 1 1
1 1 10
1 1 1

Sample Output

newbee 3 48
team 3 60
behappy 3 310
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

struct data
{
    char name[15];
    int x;
    int y;
    int z;
    int xx;
    int yy;
    int zz;
    int ti;
    int zong;
}num[105];
bool cmp(data a,data b)
{
    if(a.ti==b.ti)
        return a.zong<b.zong;
        return a.ti>b.ti;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int i;
        for(i=0;i<n;i++)
        {
            scanf("%s",num[i].name);
            scanf("%d%d%d",&num[i].x,&num[i].y,&num[i].z);
        }
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&num[i].xx,&num[i].yy,&num[i].zz);
        }
        for(i=0;i<n;i++)
        {
            num[i].zong=0;
            num[i].ti=0;
        }
        for(i=0;i<n;i++)
        {
            if(num[i].x!=-1)
            {
                num[i].zong+=num[i].x+(num[i].xx-1)*20;
                num[i].ti++;
            }
            if(num[i].y!=-1)
            {
                num[i].zong+=num[i].y+(num[i].yy-1)*20;
                num[i].ti++;
            }
            if(num[i].z!=-1)
            {
                num[i].zong+=num[i].z+(num[i].zz-1)*20;
                num[i].ti++;
            }
        }
        sort(num,num+n,cmp);
        for(i=0;i<n;i++)
        {
            printf("%s %d %d\n",num[i].name,num[i].ti,num[i].zong);
        }

    }
    return 0;
}


戏说三国(注意审题!!)

Problem:D

Time Limit:1000ms

Memory Limit:65536K

Description

   东汉末年,宦官当权,民不聊生。灵帝中平元年,张角兄弟发动黄巾起义,官军闻风丧胆。为抵抗黄巾,幽州太守刘焉出榜招兵。榜文前,刘备、关羽、张飞三兄弟萍水相逢。三人都有为国效力之心,于是桃园结为异姓兄弟,开始了一段三国浪漫传奇……
  如果我问你三国中谁最聪明你一定会说是诸葛亮,我要问你谁武功最高,保不准你就要说关羽。是啊,我们的刘备对于优秀的手下向来十分满意。可是有一天,刘备在无意间在朋友圈里看到了梁山的宋江正在进行英雄排座次,最可气的是这条动态已经被转发评论了无数次了……这一下可气坏了刘备,他决定也来一次,蜀中文武百官大排名。
为了公平起见,诸葛亮帮他制定一条评分标准:每个官员有一个智育、德育、武育三个分数,分别以b%,a%,c%的比率计入加权总分,按总分降序排列,总分相同按智育折合后的分数降序,智育相同按德育,依次类推最终决定排名。(保证没有排名一样的两个人)

Input

输入第一行t(1&lt;=t&lt;=1000)表示输入的组数。接下来每组第一行1个整数n(1&lt;=n&lt;=100000)三个实数a,b,c(a+b+c=100)接下来n行每行包括英雄的名字,字符串s(1&lt;=len&lt;=20,全为小写字母) 智育、德育、武育的分数(整数)。(1~100)

Output

每组第一行输出是第几组输出Case #t:接下来输出n行每行包括英雄的名字,总分,智育、德育、武育折合后的分数(保留四位小数)。

Sample Input

1
3 20.00  20.00  60.00
zhugeliang 90 80 0
zhangfei 0 0 100
guanyu 10 100 100

Sample Output

Case #1:
guanyu 82.0000 2.0000 20.0000 60.0000
zhangfei 60.0000 0.0000 0.0000 60.0000
zhugeliang 34.0000 18.0000 16.0000 0.0000
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
struct hs{
char name[25];
int q,w,e;
float qq,ww,ee,s;
}h[100010];
bool pp(hs,hs);
int main()
{
    int n,i,j,t,r;
    float a,b,c;
    scanf("%d",&t);
    for (r=1;r<=t;r++)
    {
        scanf("%d%f%f%f",&n,&a,&b,&c);
        a/=100;
        b/=100;
        c/=100;
        for (i=0;i<n;i++)
        {
            scanf("%s",h[i].name);
            scanf("%d%d%d",&h[i].q,&h[i].w,&h[i].e);
            h[i].qq=b*h[i].q;
            h[i].ww=a*h[i].w;
            h[i].ee=c*h[i].e;
            h[i].s=h[i].qq+h[i].ww+h[i].ee;
        }
        sort(h,h+n,pp);
        printf("Case #%d:\n",r);
        for (i=0;i<n;i++)
        {
            printf("%s %.4f %.4f %.4f %.4f\n",h[i].name,h[i].s,h[i].qq,h[i].ww,h[i].ee);
        }
    }
    return 0;
}
bool pp(hs q,hs w)
{
    return q.s>w.s;
}


排序

Problem:E

Time Limit:1000ms

Memory Limit:65536K

Description

输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
	你的任务是:对这些分割得到的数字,依从小到大的顺序排序输出

Input

输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。  
	输入数据保证:分割得到的非负整数长度不大于100;输入数据不可能全由‘5’组成。

Output

对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。

Sample Input

0051231232050775

Sample Output

0 77 12312320
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

struct in
{
    char s[110];
}nt[1010];

bool cmp(in a,in b)
{
    int alen,blen;
    alen=strlen(a.s);
    blen=strlen(b.s);
    if(alen<blen)
        return true;
    else if(alen>blen)
        return false;
    else
    {
        if(strcmp(a.s,b.s)<0)
            return true;
        else
            return false;
    }
}

int main()
{
    int len,tlen,k;
    int i,d;
    char s[1010],st[110];
    memset(st,0,sizeof(st));
    while(scanf("%s",&s)!=EOF)
    {
        len=strlen(s);
        k=0;
        tlen=0;
        for(i=0;i<=len;i++)
            if(i==len||s[i]=='5')
        {
            if(tlen==0)
                continue;
            for(d=0;d<tlen-1;d++)
                if(st[d]!='0')
                break;
            strcpy(nt[k++].s,st+d);
            memset(st,0,sizeof(st));
            tlen=0;
        }
        else
        {
            st[tlen++]=s[i];
        }
        sort(nt,nt+k,cmp);
        printf("%s",nt[0].s);
        for(i=1;i<k;i++)
            printf(" %s",nt[i].s);
        printf("\n");
    }
    return 0;
}