Skip to content

乒乓球

【问题描述】

华华最近对乒乓球比赛的统计数据进行了一些分析,首先将比赛每个球的胜负列成一张表,然后计算在11分制下双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分): WWWWWWWWWWWWWWWWWWWWWWLW 在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。如果一局比赛刚开始,则此时比分为0比0。

你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。

【文件输入】

输入文件名为table.in,每个输入文件包含若干行字符串,字符串有大写的W、L和E组成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。

【文件输出】

输出文件名为table.out,有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。

【样例输入】

WWWWWWWWWWWWWWWWWWWWWWLWE
1

【样例输出】

11:0
11:0
1:1
1
2
3

代码

题目很简单,具体看代码

Click me to view the code
c
#include <cstdio>
#include <cstring>

char f[10000] ={0};

int main(){
    int w=0,l=0;
    int id =0; //id = index
    int i,j;
    scanf("%s",f);
    int len = strlen(f);
    while(id < len){
        if(f[id] == 'W')
            w++;
        else if( f[id] == 'L')
            l++;
        if( l == 11 || w== 11){
            printf("%d:%d\n",w,l);
            l = w = 0;
        }
        id++;
    }
    //输出最后剩余
    printf("%d:%d",w,l);
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

国名排序

【问题描述】

小李在准备明天的广交会,明天有来自世界各国的客户跟他们谈生意,小李要尽快的整理出名单给经理看,清你帮助他把客户来自的国家按英文字典次序排好吗?例如小李手上有来自加拿大,美国,中国的名单,排好序的名单应是美国,加拿大,中国。

【文件输入】

第一行为一个n(n<=100)表示n个国家,第2行到第n+1行分别为n个国家的名字。

【文件输出】

输出共n行,分别为n个国家按字典顺序的排列。

【样例输入】

3
China
Canada
America
1
2
3
4

【样例输出】

America
Canada
China
1
2
3

代码

题目很简单,具体看代码

Click me to view the code
c
#include <cstdio>
#include <cstring>

int n;
char tmp[111][100] = {0};

void qsort(int l,int r){
    char key[100];
    if(l < r){
        int i =l,j=r;
        strcpy(key,&tmp[l][0]);
        while(i<j){
            while( i<j && strcmp(&tmp[j][0],key)>=0) j--;
            if(i < j) strcpy(&tmp[i++][0],&tmp[j][0]);
            while( i<j && strcmp(&tmp[i][0],key) <=0) i++;
            if(i < j) strcpy(&tmp[j--][0],&tmp[i][0]);
        }
        strcpy(&tmp[i][0],key);
        qsort(l,i-1);
        qsort(i+1,r);
    }
}

int main(){
    scanf("%d",&n);
    int i,j;
    for(i=1;i<=n;i++){//读入
        scanf("%s",&tmp[i][0]);
    }
    qsort(1,n);
    for(i=1;i<=n;i++)
        printf("%s\n",&tmp[i][0]);

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

题目 念数字

【问题描述】

编一个“念数字”的程序,它能让计算机完成以下工作:当你输入一个0至99之间的数后,计算机就会用汉语拼音印出这个数。如果输入的数不在0到99之间,就印出“CUO LE”。

【样例输入】

35
1

【样例输出】

SAN SHI WU 
1

代码

Click me to view the code
c
#include <cstdio>

char shu[11][100] = {
    {"LING"},
    {"YI"},
    {"ER"},
    {"SAN"},
    {"SI"},
    {"WU"},
    {"LIU"},
    {"QI"},
    {"BA"},
    {"JIU"},
    {"SHI"}
};
int n;

int main(){
    scanf("%d",&n);

    if( n < 0 || n > 99 ){
        printf("CUO LE");
        return 0;
    }


    if( n >=0 && n <= 10)
        printf("%s",&shu[n][0]);
    else if( n >10 && n <= 19 ){
        printf("SHI "); 
        printf("%s",&shu[n%10][0]);
    }
    else if( n >=20 && n <= 99){
        printf("%s ",&shu[n/10][0]);
        printf("SHI");
        if(n % 10 != 0){
            printf(" %s",&shu[n%10][0]);
        }
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

笨小猴(NOIP2008提高)

【问题描述】

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。

【输入文件】

输入文件word.in只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。

【输出文件】

输出文件word.out共两行: 第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”; 第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。

【样例输入1】

error
1

【样例输出1】

Lucky Word
2
1
2

【样例1解释】

单词error中出现最多的字母r出现了3次,出现次数最少的字母出现了1次,3-1=2,2是质数。

【输入样例2】

oiympic 
1

【输出样例2】

No Answer 
0 
1
2

【样例2解释】

单词oiympic中出现最多的字母i出现了2次,出现次数最少的字母出现了1次,2-1=1,1不是质数

代码

代码很简单,具体看代码

Click me to view the code
c
#include <cstdio>
#include <cstring>
#include <cmath>

char str[1000];
int cnt[1000]= {0};
int maxn,minn;

bool isPrime(int x){
    if(x <2)
        return false;
    int i;
    for(i=2;i<=sqrt(x)+0.5;i++){
        if( x % i == 0)
            return false;
    }
    return true;
}

int main(){
    int i;
    scanf("%s",str);
    int len = strlen(str);
    maxn = -1,minn = 9999;
    int tmp;
    for(i=0;i<len;i++){
        tmp = ++cnt[ str[i] ];
        if(tmp > maxn)
            maxn = tmp;
    }
    for(i='a';i<='z';i++){
        if( cnt[i] < minn && cnt[i] !=0)
            minn = cnt[i];
    }
    if( isPrime( maxn - minn)){
        printf("Lucky Word\n");
        printf("%d", maxn - minn);
    }
    else{
        printf("No Answer\n");
        printf("%d", 0);
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

统计

【问题描述】

编写一个程序,统计从键盘输入的n个单词中以“con”开头的单词个数,以及给定的某个字母出现频率。

【文件输入】

第1行为n(n<=30)和统计的字母,以下有n行,每行一个单词。

【文件输出】

输出共两行,第一行是以“con”开头的单词个数;第二行为统计字母出现的频率(保留两位小数)

【样例输入】

3 e
continue
file
delete
1
2
3
4

【样例输出】

1
27.78%
1
2

代码

题目很简单,直接看代码

Click me to view the code
c
#include <cstdio>
#include <cstring>

//字符串
char con[] = "con";
int n;
char c;

char tmp[100] = {0};
int main(){
    scanf("%d",&n);
    scanf(" %c",&c);

    int i,j;
    int cnt=0,sum=0,cnt_con=0;//计数用
    for(i=1;i<=n;i++){
        scanf("%s",tmp);
        int len = strlen(tmp); //长度
        sum += len;
        for(j=0;j<len;j++)
            if(tmp[j] == c)
                cnt++;
        tmp[3] = '\0'; //指定结束
        if(strcmp(tmp,con) == 0)
            cnt_con++;
    }

    printf("%d\n",cnt_con);
    printf("%0.2lf%%",cnt*1.0/sum*100);
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

译码程序

【问题描述】

小明从小就喜欢编解码游戏,他现在又编写了一个译码程序,把一个英语句子全部译成了数字代码。他采用的译码规则是以数字1代替字母A,数字2代替字母B,……,26代替字母Z,如遇空格则打印一个星号‘*’,遇到逗号则打印一个‘#’。你知道他是怎么实现的吗?

【输入文件】

输入文件code.in包括一个英文句子,英文句子中只包含大写字母,‘,’和空格,句子以‘.‘结束。

【输出文件】

输出文件code.out包含的是一段译码。

【样例输入】

HI,JOHN,WELCOME BACK TO SCHOOL.
1

【样例输出】

89#1015814#2351231513
1

代码

程序很简单,具体看代码

Click me to view the code
c
#include <cstdio>
#include <cstring>

char str[1000];

int main(){
    scanf("%s",str);
    int len = strlen(str);
    int i;
    for(i=0;i<len-1;i++){
        if( str[i] >= 'A' && str[i] <= 'Z')
            printf("%d",str[i]-'A'+1);
        else if( str[i] == ' ')
            printf("*");
        else if( str[i] == ',')
            printf("#");
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

谁拿了最多奖学金(NOIP2005提高)

【问题描述】

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

  • 1)院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
  • 2)五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
  • 3)成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
  • 4)西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;
  • 5)班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;

只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。

【文件输入】

输入的第一行是一个整数N(1<=N<=100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。

【文件输出】

输出包括三行, 第一行是获得最多奖金的学生的姓名, 第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。 第三行是这N个学生获得的奖学金的总数。

【样例输入】

4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1
1
2
3
4
5

【样例输出】

ChenRuiyi
9000
28700
1
2
3

代码

题目很简单,具体看代码

Click me to view the code
c
#include <cstdio>
#include <cstring>

int n;
struct _stu {
    char name[30]; //名字
    int c1;//成绩1
    int c2;//成绩2
    char g;//干部
    char x;//西部
    int lun;//论文
    int golden;//奖学金
}st[100];

//判断一个人的奖学金
void golden_judge(_stu &student){
    student.golden = 0;//清0
    if(student.c1 >80 && student.lun >=1)
        student.golden += 8000;
     if(student.c1 >85 && student.c2 > 80)
        student.golden += 4000;
     if(student.c1 >90 )
        student.golden += 2000;
     if(student.c1 >85 && student.x == 'Y' )
        student.golden += 1000;
     if(student.c1 >80 && student.g == 'Y' )
        student.golden += 850;
}

int main(){
    scanf("%d",&n);
    int i;
    int sum = 0;
    int idx; // 最高学生的下标
    int max = -1;
    for(i=0;i<n;i++){
        _stu &t = st[i];
        scanf("%s %d %d %c %c %d",t.name,&t.c1,&t.c2,&t.g,&t.x,&t.lun);
        golden_judge(st[i]);
        sum += st[i].golden;
        if(max < st[i].golden){
            max = st[i].golden;
            idx = i;
        }
    }
    printf("%s\n",st[idx].name);
    printf("%d\n",st[idx].golden);
    printf("%d",sum);

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51