今天在打完热身赛补题时发现一处以前没注意到的地方,白白浪费了两个小时进行debug,这里记录一下:

2-1 有理数均值

本题要求编写程序,计算N个有理数的平均值。
输入格式:输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1

int gcd(int x,int y);

int main()
{
    int n,fenzi=0,fenmu=1,up,down,i;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d/%d",&up,&down);
        if(up==0)
            continue;
        fenzi=up*fenmu+fenzi*down;   //分子接收数据
        fenmu*=down;   //分母接收数据
        if(i==n-1)
            fenmu*=n;   //求平均数则 分母*n
        int max_gongyue=gcd(fenzi,fenmu);   //约分
        fenzi/=max_gongyue;
        fenmu/=max_gongyue;
    }
    if(fenzi==0)
		printf("0");
	else if(fenmu==1)
        printf("%d",fenzi);
	else
		printf("%d/%d",fenzi,fenmu);
    return 0;
}

int gcd(int x,int y)
{
    if(y==0)
        return x;
    else
        return gcd(y,x%y);
}

3-2 伙伴

近来,程序社团开始“创客”——用程序来开发一种“找伙伴的数字游戏”。这个伙伴游戏将玩家分为A和B二组。每组每个玩家可以得到一个数字号码。
游戏规则是这样的:A组里的每个人的数字与B组里每个人的数字进行“数字配对”——即加法运算,若运算的结果恰巧是B组内其他玩家手捏的数字号码,那么游戏就可以累计一个分值,这个分值就是B组内这个“恰巧”的数字号码。当然,在B组内“恰巧”的数字号码可能不止一个,游戏允许再次累计。
比如加法运算后的“恰巧”的数字是3,而B组内共有2个玩家捏有此数字,那么本组就可以得到6分。
你是游戏的开发者之一,你需要迅速计算出找伙伴游戏的最终得分。
输入格式:
第一行有二个数字n和m,分别表示A组和B组的人数。
第二行有n个整数ai,每个整数之间有一个空格,表示n个玩家手中的数字号码。
第三行有m个整数bi,每个整数之间有一个空格,表示m个玩家手中的数字号码。

输出格式:
只有一行,一个数字s,表示游戏的最终分数。

输入样例1:
3 3
3 5 6
2 7 4
输出样例1:
14
样例说明:
A组内捏有”3”的玩家与B组内三个玩家进行“数字配对”,遇4时相加后, 发现B组内有一个恰巧的数字“7”;
A组内捏有“5”的玩家与B组内三个玩家进行“数字配对”,遇2相加后, 发现B组内有一个恰巧的数字“7”;
当A组内捏有“6”的玩家与B组内三个玩家进行“数字配对”,无论与谁的数字相加,都没有在B组发现一个恰巧的数字;
因此最终结果是:7+7=14。

输入样例2:
3 3
2 5 2
6 8 8
输出样例2:
32
样例说明:
A组第1玩家捏有数字”2”,与B组进行“数字配对”时,得分8+8;
A组第2玩家捏有数字”5”,与B组进行“数字配对”时,得分0;
A组第3玩家捏有数字”2”,与B组进行“数字配对”时,得分8+8;
因此最终得分为:8+8+8+8。

【数据规模】
30%的数据,1<=n,m<=3,1<=ai,bi<=100
50%数据,1<=n,m<=100,1<=ai,bi<=100
70%数据,1<=n,m<=10000,1<=ai,bi<=100
100%数据,1<=n,m<=100000,1<=ai,bi<=100

int main()
{
    int m,n,x,y;
    long long sum=0;
    scanf("%d %d",&m,&n);
    int arr[100000]={0},brr[100000]={0};
    for(int i=0;i<m;i++){
        scanf("%d",&x);
        arr[x]++;
    }
    for(int i=0;i<n;i++){
        scanf("%d",&y);
        brr[y]++;
    }
    for(int i=1;i<=100;i++){
        for(int j=1;i+j<=100;j++){
            if(arr[i]>0&&brr[j]>0&&brr[i+j]>0){
                sum+=arr[i]*brr[j]*brr[i+j]*(i+j);   

                //A中符合条件的卡片数*B中符合条件的卡片数*B拿到正确结果的人数*(应得的分数)

            }
        }
    }
    printf("%lld",sum);
    return 0;
}

基础题

1-1 重要的话说三遍

这道超级简单的题目没有任何输入。你只需要把这句很重要的话 —— “I’m gonna WIN!”——连续输出三遍就可以了。注意每遍占一行,除了每行的回车不能有任何多余字符。

int main()
{
    for(int i=0;i<3;i++){
        printf("I'm gonna WIN!");
        if(i!=2)
            printf("\n");
    }
    return 0;
}

1-2 整数积

小明没带草稿纸,心算搞不定整数的乘积,只有请你帮忙设计程序来求输入的任意三个整数的乘积。

输入格式:
输入三个由空格隔开的整数a,b,c,(-1000 < a , b , c < 1000 )

输出格式:
输出三个整数的乘积

输入样例:
1 2 3
输出样例:
6

int main()
{
    long long a,b,c,d;
    scanf("%lld%lld%lld",&a,&b,&c);
    d=a*b*c;
    printf("%lld",d);
    return 0;
}

1-3 三天打鱼两天晒网

中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?

  • 以5为一个循环,然后正常判断即可

输入格式:
输入在一行中给出一个不超过1000的正整数N。

输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。

输入样例1:
103
输出样例1:
Fishing in day 103
输入样例2:
34
输出样例2:
Drying in day 34

int main()
{
    int n,x;
    scanf("%d",&n);
    x=n%5;
    if(x>0&&x<=3)
        printf("Fishing in day %d",n);
    else
        printf("Drying in day %d",n);
    return 0;
}

1-4 用天平找小球

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

输入格式:
输入在一行中给出3个正整数,顺序对应球A、B、C的重量。

输出格式:
在一行中输出唯一的那个不一样的球。

输入样例:
1 1 2
输出样例:
C

int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    if(a==b)
        printf("C");
    else if(a==c)
        printf("B");
    else if(b==c)
        printf("A");
    return 0;
}

1-5 100以内的加法

小明刚上小学一年级,数学老师刚刚教会了100以内的整数加法运算,数学老师期中测试出了一道题,题目为求两个整数之间的所有整数之和,包括边界整数值,小明很是为难?现要你编程帮小明解决问题。

输入格式:
在一行中输入两个边界整数值m,n(1<= m <= n <=100),中间以空格隔开。

输出格式:
在一行中输出m到n之间的所有整数和。

输入样例:
2 7
输出样例:
27

int main()
{
    int a,b,sum=0;
    scanf("%d%d",&a,&b);
    for(int i=a;i<=b;i++){
        sum+=i;
    }
    printf("%d",sum);
    return 0;
}

1-6 循环的统计

在墙角堆放着一堆完全相同的正方体小木块,从上往下数起,第一层是1块,第二层是3块,第三层是6块…… 因为木块堆得实在是太有规律了,你只要知道它的层数就可以计算所有木块的数量了。
题目图片

  • 观察可得,第i层比上一层多了i个方块。

输入格式:
只有一个整数 n ,表示这堆小木块的层数,已知1 <= n <= 100 。

输出格式:
只有一个整数,表示这堆小木块的总数量。

输入样例:
5
输出样例:
35

int main()
{
    int n,sum1=0,sum=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        sum1+=i;
        sum+=sum1;
    }
    printf("%d",sum);
    return 0;
}

1-7 求特殊方程的正整数解

本题要求对任意给定的正整数N,求方程X^2+Y^2=N的全部正整数解。

  • 数据较小,嵌套枚举即可

输入格式:
输入在一行中给出正整数N(≤10000)。

输出格式:
输出方程X^2+Y^2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。

输入样例1:
884
输出样例1:
10 28
20 22
输入样例2:
11
输出样例2:
No Solution

int main()
{
    int n,flag=0;
    scanf("%d",&n);
    for(int i=0;i<=sqrt(n);i++){
        for(int j=0;j<sqrt(n);j++){
            if(i*i+j*j==n&&i<=j){
                printf("%d %d\n",i,j);
                flag=1;
            }
        }
    }
    if(!flag){
        printf("No Solution");
    }
    return 0;
}

1-8 猜数字游戏

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

  • 看着唬人其实很普通的一道题,准确处理好每个变量关系即可

输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:
58 4
70
50
56
58
60
-2

输出样例:
Too big
Too small
Too small
Good Guess!

int main()
{
    int n,t,x,flag=0,num=0;
    scanf("%d %d",&n,&t);
    while(scanf("%d",&x)!=EOF){
        num++;
        if((num<=t&&x<0)||(num>t)){
            printf("Game Over\n");
            break;
        }
        if(x>n){
            printf("Too big\n");
            flag++;
        }
        else if(x<n){
            printf("Too small\n");
            flag++;
        }
        else{
            if(flag==0){
                printf("Bingo!\n");
                break;
            }
            else if(flag<=2&&flag>=1){
                printf("Lucky You!\n");
                break;
            }
            else if(flag>2&&flag<t){
                printf("Good Guess!\n");
                break;
            }
            else{
                printf("Game Over\n");
                break;
            }
        }
    }
    return 0;
}

进阶题

2-1 有理数均值

  • 见文章开头

2-2 求矩阵的局部极大值

给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

  • 找的时候舍弃二维数组的最外一层,判断与四周的关系即可

输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

输入样例1:
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
输出样例1:
9 2 3
5 3 2
5 3 4
输入样例2:
3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1
输出样例2:
None 3 5

int main()
{
    int m,n,flag=1;
    scanf("%d%d",&m,&n);
    int arr[m+1][n+1];
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&arr[i][j]);
        }
    }
    for(int i=1;i<m-1;i++){
        for(int j=1;j<n-1;j++){
            if((arr[i][j]>arr[i-1][j])&&(arr[i][j]>arr[i][j-1])&&(arr[i][j]>arr[i+1][j])&&(arr[i][j]>arr[i][j+1])){
                printf("%d %d %d\n",arr[i][j],i+1,j+1);
                flag=0;
            }
        }
    }
    if(flag){
        printf("None %d %d",m,n);
    }
    return 0;
}

2-3 傻傻分不清楚

有一次小Y的键盘的大写键坏了(打字母随机大小写),但他现在需要照着打几段字符串(只有英文字母),不过他有时候会有点粗心会打错字母。然后现在我需要眼尖的你来帮帮我帮我找出他有没有粗心(只是大小写不同不算粗心),如果没有请你告诉我键盘一共坏了几次。

  • 记得更新数组即可

输入格式:
输入第一行给出正整数N,代表他接下来要打的字符串数量。
随后给出2N行字符串,两两对应。
每段字符串长度小于100。本题多组数据。

输出格式:
每两个字符串输出一行,如果他粗心了输出“NO!”,没有粗心输出“YES!”并在后面空一格输出键盘坏的次数

输入样例:
在这里给出一组输入。例如:
2
abcdfef
aBCdfef
c
c
1
qwer
QEWr
输出样例:
在这里给出相应的输出。例如:
YES! 2
YES! 0
NO!

int main()
{
    int n,flag=0,i;
    char arr[105],brr[105];
    while(scanf("%d",&n)!=EOF){
        scanf("%s%s",arr,brr);
        for(i=0;i<strlen(arr);i++){
                if((arr[i]==brr[i]))
                    continue;
                else if((arr[i]-32==brr[i])||(arr[i]+32==brr[i])){
                    flag++;
                    continue;
                }
                else{
                    printf("NO!\n");
                    break;
                }
        }
        if(i==strlen(arr)){
            printf("YES! %d\n",flag);
        }
        for(i=0;i<strlen(arr);i++){   //记得更新数组
            arr[i]=0;
            brr[i]=0;
        }
        flag=0;
    }
    return 0;
}

2-4 谁先倒

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

  • 注意同输同赢时不要处理数据

输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,格式为:
甲喊 甲划 乙喊 乙划
其中喊是喊出的数字,划是划出的数字,均为不超过100的正整数(两只手一起划)。

输出格式:
在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。

输入样例:
1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
输出样例:
A
1

int main()
{
    int m,n,t,jh,jhw,yh,yhw,flag1=0,flag2=0;
    scanf("%d%d",&m,&n);
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d%d",&jh,&jhw,&yh,&yhw);
        if(jhw==jh+yh&&yhw!=jh+yh){
            flag1++;
            }
        if(yhw==jh+yh&&jhw!=jh+yh){
            flag2++;
        }
        if(flag1>m){
            printf("A\n%d",flag2);
            break;
        }
        if(flag2>n){
            printf("B\n%d",flag1);
            break;
        }
    }
    return 0;
}

登顶题

3-1 帅到没朋友

当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。

  • 当输入人数为1时不要处理,输出时注意5位格式!

输入格式:
输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。

注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。

输出格式:
按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome。

注意:同一个人可以被查询多次,但只输出一次。

输入样例1:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
输出样例1:
10000 88888 23333
输入样例2:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
输出样例2:
No one is handsome

int main()
{
    int n,x,y,t,num,flag=1;
    int arr[100000]={0};
    scanf("%d",&n);
    for(int j=0;j<n;j++){
        scanf("%d",&x);
        for(int i=0;i<x;i++){
            scanf("%d",&y);
            if(x!=1)
            arr[y]++;
        }
    }
    scanf("%d",&t);
    while(t--){
        scanf("%d",&num);
        if(arr[num]==0){
            flag=0;
            printf("%05d",num);
            if(t>1)
                printf(" ");
            arr[num]=1;
        }
    }
    if(flag)
            printf("No one is handsome");
    return 0;
}

3-2 伙伴

  • 见文章开头

3-3 密文游戏

JLU最近流行密文游戏。发送者把信息(原文)按约定的规则变成密文发给接收者,接收者拿到密文按解密规则得到原文。其它人不知道加密解密规则,即使拿到信息的密文,也无法得知原文。
小明是你的好朋友,想和你一起玩密文游戏。你俩约定了一个简单的加密解密方案:字符 0 映射字母 A,字符 1 映射字母 B,依次类推,字符 9 映射字母 J。例如:原文1314的密文为BDBE。
昨天,你给小明发了一条信息。由于未知原因,密文到小明那里发生了缺失。今天上课,你俩见面对照了原文和密文,发现密文丢失了若干字符。设原文S的长度为n,密文T的长度为m,小明突发奇想:对照原文,有多少种方案能把密文补全,字母数量和位置不同,都视为不同的方案。作为好友的你,帮他计算一下吧。

输入格式:
第一行,原文S,长度为n(2≤n≤2000)。
第二行,密文T,长度为m(1≤m ≤ n-1 )。

输出格式:
一行,所求的方案数

输入样例:
在这里给出一组输入。例如:
1414
BE
输出样例:
在这里给出相应的输出。例如:
3
样例说明
样例中3种补全方案如下。()中代表所补的密文。
BE(BE)
B(EB)E
(BE)BE

解析还未出炉,先看看别的吧~