ACM招新赛<赛后题解与反思总结>②

问题 A: 再遇“Hello World”(Easy)

题目描述

鉴于上次出的“Hello World”过于恐怖导致好多人都做不出来,所以小劉同学打算再给大家出一道"Hello World"(Easy).现在小劉同学要参加一场算法比赛,这场比赛算上小劉在内一共有五队人参加,每个人各自为一队,小劉同学是最后一队,经过几个小时的麓战,比赛结果出炉,给出每个人的过题数目,请你判断小劉同学是否能成为唯一的第一名,即小劉同学过题数最多并且没有人与他过题数相同。若小劉同学是唯一的第一名,则输出"Hello World"(不加引号),否则输出"算竞高手,你还得练"(不加引号,中间是中文逗号)

输入描述

第一行五个数a,b,c,d,e,分别表示五名同学的过题数,最后一个为小劉的过题数(1<=a,b,c,d,e<=1018)

输出描述

判断小劉同学是否为唯一的第一名,若是则输出"Hello World"(不加引号),否则输出"算竞高手,你还得练"(不加引号,中间是中文逗号).

样例输入

1 1 1 1 3

样例输出

Hello World
#include
int main()
{
    long long int a,b,c,d,e;//声明五个long long int类型的变量a, b, c, d, e
    
    scanf("%lld %lld %lld %lld %lld",&a,&b,&c,&d,&e);
    
    if(e>a&&e>b&&e>c&&e>d)// 使用if语句检查e是否大于a, b, c, d
    {
        printf("Hello World");
    }
    else
    {
        printf("算竞高手,你还得练");
    }
    return 0;
}

问题 B: 再遇"Hello World"(Hard)

题目描述

鉴于上次出的“Hello World”过于恐怖导致好多人都做不出来,所以小劉同学打算再给大家出一道"Hello World"(Hard).小劉同学在再遇"Hello World"(Easy)中参加了一场算法比赛,现在它要参加另一场算法比赛,这场比赛算上小劉在内一共有n队人参加,每个队伍最少为1人,最多为3人,首先给出每个队伍的人数,小劉同学在最后一队,经过几个小时的麓战,比赛结果出炉,给出每个人的过题数目。每一队的过题数等于该队所有人的过题数之和。请你判断小劉同学这一队是否能成为唯一的第一名,即小劉同学这一队过题数最多并且没有其他的队伍与他们队伍过题数相同。若小劉同学这一队是唯一的第一名,则输出"Hello World"(不加引号),否则输出"算竞高手,你还得练"(不加引号,中间是中文逗号).

输入描述

第一行一个数字n,表示一共有n队(1<=n<=1000)
接下来n行,每一行第一个数字表示该队的人数,后边会有对应队人数个数字,每个数字表示该队对应人的过题数,(1<=每个人的过题数<=1018)
(如第一队有3个人,那么第一行就有四个数字)

输出描述

判断小劉这一队是否能获得唯一的第一名,若能则输出"Hello World"(不加引号),否则输出"算竞高手,你还得练"(不加引号,中间是中文逗号).

样例输入

3
3 1 1 1
3 1 1 2
3 1 1 3

样例输出

Hello World

提示

对题目所给样例解释:

第一行n=3,表示有3队人

第二行表示第一队人的过题数分别为1,1,1,一共过了3题

第三行表示第二队人的过题数分别为1,1,2,一共过了4题

第四行表示第三队人的过题数分别为1,1,3,一共过了5题

小劉同学所在的队伍一定在最后一队,所以该队过题数最多,为5题并且没有别的队伍与他们队的过题数相同

故小劉同学所在的队伍获得唯一的第一名,输出"Hello World"

#include
#define int long long
signed main()
{
    int n;
    scanf("%lld",&n);int max=0;
    for(int i=1;i=max)
        {
            max=sum;
        }
    }
    //小刘
    int x,ans=0;
    scanf("%lld",&x);
    for(int i=1;i<=x;i++)
        {
            int a;
            scanf("%lld",&a);
            ans+=a;
        }
    if(ans>max)
    {
    printf("Hello World");
    }
    else
    {
        printf("算竞高手,你还得练");
    }
     
}

问题 C: 又是签到?

题目描述

有四个同学,现在给出他们的身高,由于小劉同学实力不好,两个身高不同的人,他无法分清楚,现在需要你的帮助。将这四个人的身高按从小到大的顺序排列,输出左对齐9个字符。

输入描述

第一行给出四个浮点数a,b,c,d,分别表示每个人的身高

输出描述

输出按从小到大排序好的数字,输出时每个人的身高保留两位小数,左对齐9个字符

样例输入

1.00 2.00 1.50 3.00

样例输出

1.00     1.50     2.00     3.00   

提示

身高不一定只有两位小数

 此题可以用冒泡排序更简单,这是我当时写的很麻烦

#include
int main()
{
    double a,b,c,d,temp=0;
    scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
    if(a>b)
    {
        temp=a;
        a=b;
        b=temp;
    }
    if(a>c)
    {
        temp=a;
        a=c;
        c=temp;
    }
    if(a>d)
    {
        temp=a;
        a=d;
        d=temp;
    }
    if(b>c)
    {
        temp=b;
        b=c;
        c=temp;
    }
    if(b>d)
    {
        temp=b;
        b=d;
        d=temp;
    }
    if(c>d)
    {
        temp=c;
        c=d;
        d=temp;
    }
    printf("%-9.2f%-9.2f%-9.2f%-9.2f",a,b,c,d);
    return 0;
}

问题 D: 是真签到?

题目描述

小劉的朋友在玩金铲铲之战这一款游戏,在这个游戏的某一个模式中有许多张五费卡,当一张五费卡有九张时即可将该五费卡变成三星,现在小劉的朋友还剩n个五费卡没有变成三星,也就是还有n个五费卡还差一张就要三星了,假设当小劉金币足够时就能够直接购买所需要的五费卡,现在小劉有x金币,一张五费卡需要五金币来购买,每回合会得到m金币,现在请问还要几回合(起始时为第0回合),小劉的朋友才能将所有的五费全部变成三星,例如现在是第二回合,小劉朋友的金币够了,那么输出第二回合即可。

输入描述

第一行三个数字n,x,m,分别表示还需要变成三星的五费卡,小劉的朋友起始有的金币,每回合增加的金币
(0<=n,x<=109,1<=m<=109)

输出描述

输出在第几回合,能将所有的五费卡全部变成三星

样例输入

1 4 1

样例输出

1

提示

题目中给出的样例解释:

小劉的朋友还有1张五费卡没有变成三星,现在小劉有4金币为第0回合

第1回合时,增加1金币,所以第1回合时小劉的朋友有5金币,可以直接购买一张所需要的五费卡,所以输出1

 此题要考虑取整的问题

#include
#define int long long
signed main()
{
    int n,x,m;
    scanf("%lld %lld %lld",&n,&x,&m);
    int qian=5*n;
    if(x>qian)
    {
        printf("0");
    }
    else
    {
        double k=(qian-x)*1.0/m;
        //判断是否存在小数点
        int kk=(int)k;
        double b=k-kk*1.0;
        if(b!=0)
        {
            kk++;//向上取整
        }
        printf("%lld",kk);
    }
     
     

问题 E: 这绝对是真签到?

题目描述

最近是一款四字手游的周年庆,周年庆期间有一个神秘商店能够对购买的物品打折,小劉现在非常想要n款物品,很幸运的这n款物品在神秘商店中,并且对这款物品有了x折的优惠,每款物品原价都需要m个点卷,现在小劉有p个点卷,由于小劉数学很差,请你帮助小劉计算,他购买这n款物品后,还剩多少点卷,若本身点卷数量就不够,那么请输出小劉还需要几个点卷才能够将这n款物品全部购买

输入描述

第一行四个数字,n,x,m,p,分别表示n款物品,x折优惠,每款物品的原价,小劉有的点卷个数
(1<=n<=109,1<=x<=10且x均为整数,1<=m<=1000,1<=p<=109)

输出描述

输出小劉购买这n款物品后,还剩多少点卷,若本身点卷数量就不够,那么请输出小劉还需要几个点卷才能够将这n款物品全部购买(结果保留一位小数)

样例输入

3 9 5 10

样例输出

3.5

提示

注意别溢出

 绝对值 fabs函数(加个头文件 #include ?)

在C语言中,当处理的数据类型超出了其能够表示的范围时,就会发生溢出(overflow)。

#include
int main()
{
    double n,x,m,p,num;
    scanf("%lf %lf %lf %lf",&n,&x,&m,&p);
    num=p-(m*(x/10))*n;
    if(num>=0)
    {
        printf("%.1lf",num);
    }
    else
    {
        printf("%.1lf",fabs(num));
    }
    return 0;
}

问题 F: 是假签到?

题目描述

小劉正在处理一个数字,需要将它的第n位上的数字变成x,由于小劉比较笨,请你帮助他这个数字最少需要加上多少才能将第n位变成x(第几位按照数字从左往右的顺序,从第一位开始)。

输入描述

第一行一个数字L,表示数字m的长度,(1<=L<=18)
第二行一个数字m (1<=m<=1018)
第三行两个数字n,x(0<=x<=9,1<=n<=数字m的长度)
x一定大于等于原来第n位的数字

输出描述

输出将第n位变成x,最少需要将数字m加上多少

样例输入

3
201
2 1

样例输出

9

提示

题目中所给样例解释:

给出了一个数字201,需要将第二位的0变成1,

最少需要将201加上9,能够将第二位的0变成1.

 在C语言中,while(1) 是一个常见的编程结构,用于创建一个无限循环。这里的 1 表示逻辑上的真(true),因为非零值在C语言中被视为真。因此,while(1) 的条件始终为真,循环体会不断地被执行,直到程序内部通过某种方式(如 break 语句)显式地跳出循环

在 while(1) 循环内部直接使用 return 0; 会导致程序在满足特定条件时立即退出,从而终止整个程序的运行。

#include
#define int long long
signed main()
{
    int L,m,x,n;
    scanf("%lld %lld %lld %lld",&L,&m,&n,&x);
    int m1=m,k=1,p=0;//p是第n位数
    while(1)
    {
        int a=m1%10;
        if(k==L-n+1)
        {
            p=a;
            break;
        }
        m1/=10;
        k++;
    }
    if(p==x)
    {
        printf("0");
        return 0;
    }
    int res=0;
    int m2=m,q=1;
    k=1;
    while(m2!=0)
    {
        int a=m2%10;
        if(k

问题 G: 这真是签到?

题目描述

小劉同学的电脑有一个加密程序,能够将密码加密,加密程序的规则是这样的,下列是一个加密程序对应表,左侧为加密前的字符,右侧为加密后的字符
加密程序遇见左侧的字符会将其变为右侧的字符

a b
b c
c d
d e
e f
f g
g h
h i
i j
j k
k m
l n
m o
n p
o q
p r
q s
r t
s u
t v
u w
v x
w y
x z
y {
z |

现在小劉的加密程序坏了,有五个加密过的字符无法破译,请你帮助小劉同学破译出来,输出按字符串输出,即每个字符之间没有间距。

输入描述

第一行五个字符,确保都是题目中所给的加密字符,即上表右侧的字符

输出描述

输出解密后的字符串

样例输入

b c d e f

样例输出

abcde

提示

给出的五个字符,按照给出的加密表,反推即可得到abcde

前十个为一个规律,后十六个是一个规律,通过ASCII观察规律哦(手动滑稽)

#include
int main()
{
    char a,b,c,d,e;
    scanf("%c %c %c %c %c",&a,&b,&c,&d,&e);
    if(a<='k'&&a>='b')
    {
        a--;
    }
    else
    {
        a-=2;
    }
    if(b<='k'&&b>='b')
    {
        b--;
    }
    else
    {
        b-=2;
    }
    if(c<='k'&&c>='b')
    {
        c--;
    }
    else
    {
        c-=2;
    }
    if(d<='k'&&d>='b')
    {
        d--;
    }
    else
    {
        d-=2;
    }
    if(e<='k'&&e>='b')
    {
        e--;
    }
    else
    {
        e-=2;
    }
    printf("%c%c%c%c%c",a,b,c,d,e);
}

你可能感兴趣的:(ACM招新赛,c语言)