计算机学院2022级新生邀请赛(二)

目录

A:欢度国庆,来签个到吧

B:世界上背单词的最好方法

C:打印图形

D:国庆假期

E:有意义的天数

F:看实力OR看脸

G:ALL KILLED

H:字符串


A:欢度国庆,来签个到吧

题目描述

欢迎大家参加河南工程学院2022级第二次新生周赛。
希望大家度过一个愉快的国庆节。

输入

一行一个整数N。

输出

输出占一行,包括标点符号。

如果N为奇数,输出"Happy National Day !"

如果N为偶数,输出'Happy National Day !'

样例输入 复制

123456

样例输出 复制

'Happy National Day !'

提示

-2147483648 < N < 2147483647

源代码 

简单的奇偶数判断 

#include <iostream>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    if(n & 1)printf("\"Happy National Day !\"");
    else printf("'Happy National Day !'");
    return 0;
}

B:世界上背单词的最好方法

题目描述

DXT正在备战12月的四六级英语考试,他现在正在背单词,他背的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。DXT学了很长时间 也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。(当然不要向这个笨蛋学习,这个方法一点也不科学····) 现在,请你帮助DXT,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。

输入

输入一行包含一个单词,单词只由小写英文字母组成。 对于所有的评测用例,输入的单词长度不超过 1000。

输出

输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。 第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

样例输入 复制

implement

样例输出 复制

e
2

提示

字典序即按字典顺序从小到大由即从a到z,如a 与 b出现次数相等就输出字典序较小的a

源代码

简单的统计字符,将小写字母映射到整型数组当中用于计数 

#include <iostream>
using namespace std;
int a[1000];
int main()
{
    char str[1000];
    gets(str);
    for(int i = 0;str[i];i ++ )
    {
        int idx = str[i] - 'a' + 1;
        a[idx] ++ ;
    }
    int maxnum = -1;
    for(int i = 1;i <= 26;i ++ )
    {
        maxnum = max(maxnum,a[i]);
    }
    for(int i = 1;i <= 26;i ++ )
    {
        if(a[i] == maxnum)
        {
            char c = i + 'a' - 1;
            printf("%c\n%d",c,maxnum);
            break;
        }
    }
    return 0;
}

C:打印图形

题目描述

zyx希望出一道新生都可以写出来, 但需要花费一些时间来AC的题目。于是他决定输出三个字母XHZ作为本题的答案,但是zyx觉得这样的话太简单了,于是他加了一点难度。输入一个数字n,这个数字意味着不同的大小比例,而我们需要做的就是,输出不同比例下的三个字母XHZ(为什么这个缩写如此熟悉!?), 为了保证最终能看清字母,我们需要保证两个字母之间有一个空行。

输入

第一行,一个整数n。

输出

当 n = 1 时,输出如下图案:
* *
 *
* *

* *
***
* *

***
 *
***

样例输入 复制

3

样例输出 复制

*     *
 *   *
  * *
   *
  * *
 *   *
*     *

*     *
*     *
*     *
*******
*     *
*     *
*     *

*******
     *
    *
   *
  *
 *
*******

提示

( 1 ≤ n ≤ 8 )

源代码

简单的打印图形  

#include <iostream>
using namespace std;
char a[1000][1000],b[1000][1000],c[1000][1000];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 1;i <= 2 + 2 * n - 1;i ++ )
    {
        for(int j = 1;j <= 2 + 2 * n - 1;j ++ )
        {
            if(i == j||i + j == 2 + 2 * n)
            {
                a[i][j] = '*';
            }
            else if(a[i][j] != '*')a[i][j] = ' ';
            printf("%c",a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    for(int i = 1;i <= 2 + 2 * n - 1;i ++ )
    {
        for(int j = 1;j <= 2 + 2 * n - 1;j ++ )
        {
            if(i == (2 + 2 * n) / 2)a[i][j] = '*';
            else if(j == 1 || j == 2 + 2 * n - 1)a[i][j] = '*';
            else a[i][j] = ' ';
            printf("%c",a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    for(int i = 1;i <= 2 + 2 * n - 1;i ++ )
    {
        for(int j = 1;j <= 2 + 2 * n - 1;j ++ )
        {
            if(i == 1 || i == 2 + 2 * n - 1 || i + j == 2 + 2 * n)a[i][j] = '*';
            else a[i][j] = ' ';
            printf("%c",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

D:国庆假期

题目描述

国庆假期到了,小马哒哒惊奇的发现今年十月一号是周六,小马哒哒感觉非常巧合,因为今天既是周末(这里周末指周六和周日)又是国庆节。 小马哒哒想要知道以后某一年国庆节是否为周末,为了方便表示,用0,1,2,3…n,代表2022,2023,2024,2025…2022+n年。 如果该年国庆节是周末,输出Yes,否则输出No。

输入

第一行,输入T,表示输入T个年份 
第二行,输入a1,a2,a3…aT, 表示2022+ai年

输出

如果该年国庆是周末(周末指周六和周日),输出Yes,否则输出No

样例输入 复制

2
1 2

样例输出 复制

Yes
No

提示

(1<=T<=5)
(0<=ai<=50)

源代码

利用吉姆拉尔森计算公式快速求解 

#include <iostream>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    while(n -- )
    {
        int delta;
        scanf("%d",&delta);
        int y = 2022 + delta;
        int m = 10;
        int d = 1;
        int w = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
        if(w == 0 || w == 6)printf("Yes\n");
        else printf("No\n");
    }
}

E:有意义的天数

题目描述

小明想知道他自出生以来到某个日期共度过了多少个有意义的天数,小明2002年1月1日出生,由于小明不喜欢数字4,所以小明认为在他人生的第k天,如果k各个位上的数字只要存在任意一个是数字4,那么这一天会被小明认为是不幸的一天。并且小明还认为,如果某一天不是不幸的一天,那么这一天就是有意义的一天。

输入

一行三个整数a,b,c分别表示年月日(题目保证输入的日期肯定在2002年1月1日之后,且合法)

输出

一行一个整数表示自小明出生以来到输入日期度过了有意义的天数。

样例输入 复制

2002 1 30

样例输出 复制

27

提示

2002<=a<=2100
1<=b<=12
1<=c<=31

小明出生当天为范围内第一天,输入的日期为范围内最后一天。

源代码

计算结束日期到开始日期总共有几天,利用总天数进行跳4,存储不含4的数字个数记为有意义的天数 

#include <iostream>
using namespace std;
int a[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
int b[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool judge(int year)
{
    if((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0))return true;
    else return false;
}
bool fun(int n)
{
    while(n > 0)
    {
        int num = n % 10;
        if(num == 4)return false;
        n /= 10;
    }
    return true;
}
int main()
{
    int y,m,d;
    scanf("%d%d%d",&y,&m,&d);
    int R = 0,res = 0;
    for(int i = 2002;i < y;i ++ )
    {
        if(judge(i))R += 366;
        else R += 365;
    }
    int flag = 1;
    if(!judge(y))flag = 0;
    for(int i = 1;i < m;i ++ )
    {
        if(flag == 1)R += a[i];
        else R += b[i];
    }
    R += d;
    for(int i = 1;i <= R;i ++ )
    {
        if(fun(i))res ++ ;
    }
    printf("%d",res);
    return 0;
}

F:看实力OR看脸

题目描述

A和B要争夺学习委员一职,但因为他们票数相等,实力也均衡,所以老师想了一个既考验运气,有可以检测实力的方法选拔。游戏胜利者为学习委员
游戏规则:老师随机分给A和B一人一个整数(分到的整数不相等),A和B需要将分到的整数分解为多个数相乘的形式,谁分解的个数多谁就获胜,如果分解个数相等,谁的最初分到的整数大谁就获胜。(假设A和B都是数学高手,他们都能找到最优的分解结果。)请你判断一下谁能成功当选学习委员。

输入

一行两个整数n,m分别表示A分到的整数和B分到的整数

输出

第一行输出成功竞选的人。 第二行输出成功竞选的人的分解结果。

样例输入 复制

20 16

样例输出 复制

B
1*2*2*2*2=16

提示

(1<=n,m<=2e9)
20最优分解结果为1 * 2 * 2 * 5=20,16最优分解结果为1 * 2 * 2 * 2 * 2=16,20最终分解为4个数相乘的形式,16最终分解为5个数相乘的形式,所以分到16的B游戏获胜。

源代码

分解质因数而已 

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
string deal(int n)
{
    string s;
    if(n == 1)
    {
        s = "1";
        return s;
    }
    int w = 2;
    int flag = 0;
    while(n != 1)
    {
        if(n % w == 0&&flag == 0)
        {
            flag = 1;
            s = s + to_string(w);
            n /= w;
        }
        else if(n % w == 0&&flag == 1)
        {
            s = s + '*' + to_string(w);
            n /= w;
        }
        else if(n % w != 0)w ++ ;
    } 
    return s;
}
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    string sa = deal(a);
    string sb = deal(b);
    if(sa != "1")sa = "1*" + sa;
    if(sb != "1")sb = "1*" + sb;
    if(sa.size() > sb.size())cout << 'A' << endl << sa << "=" << a;
    else if(sa.size() < sb.size())cout << 'B' << endl << sb << "=" << b;
    else
    {
        int wa = 1,flaga = 1;;
        for(int i = sa.size() - 1;sa[i] != '*';i -- )
        {
            flaga += (sa[i] - '0') * wa;
            wa = wa * 10; 
        }
        int wb = 1,flagb = 1;;
        for(int i = sb.size() - 1;sb[i] != '*';i -- )
        {
            flagb += (sb[i] - '0') * wb;
            wb = wb * 10; 
        }
        if(flaga > flagb)cout << 'A' << endl << sa << "=" << a;
        else cout << 'B' << endl << sb << "=" << b;
    }
    return 0;
}

G:ALL KILLED

题目描述

众嗦粥汁,AK 是 ALL KILLED 的简称,代表着算法竞赛选手在赛场上解决掉了全部的题目。我们的 HF 学长每次都能轻松 AK,因此他觉得算法比赛十分的枯燥,于是他准备进行一个优雅的 AK。

给定一个长度为 N 且只包含两种字符 K 和 A 的字符串 ,你可以对 进行如下操作:

  • 选择 S 中连续且相邻的任意两个字符 ,将其替换为 AK。

上述操作不限次数,当且仅当通过上述操作能将 S 变为为回文串时,我们称这是一个优雅的 AK,此时输出 YES,否则输出 NO。

回文串的定义:回文串是一个正读和反读都一样的字符串,例如 AKA,KAAK。

输入

共两行,第一行输入一个正整数 N ,代表字符串的长度。

接下来读入 N 个字符,是 S 包含的字符。

输出

共一行,输出 YES ,或 NO。

样例输入 复制

3
KAA

样例输出 复制

YES

提示

源代码 

#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
    ll n;
    scanf("%lld",&n);
    char head,tail;
    for(int i = 1;i <= n;i ++ )
    {
        char c;
        cin >> c;
        if(i == 1)head = c;
        if(i == n)tail = c;
    }
     
    if(n == 2)
    {
        if(head == tail)printf("YES");
        else printf("NO");
    }
    else
    {
        if(head == 'K' || tail == 'A')printf("YES");
        else printf("NO");
    }
    return 0;
}

H:字符串

题目描述

给定一个长度为 n 的由大小写英文字母构成的字符串。

请你判断,该字符串是否包含了全部 26 个英文字母?

注意,无论某个英文字母是以大写还是小写形式出现在字符串中,均视为该字符串包含此字母。

输入

第一行包含整数 n。

第二行包含一个长度为 n 的由大小写英文字母构成的字符串。

输出

如果给定字符串包含了全部 26 个英文字母,则输出 YES,否则输出 NO。

样例输入 复制

12
toosmallword

样例输出 复制

NO

提示

1≤n≤100

源代码 

#include <iostream>
using namespace std;
int a[30];
int main()
{
    int n,flag = 1;
    scanf("%d",&n);
    getchar();
    while(n -- )
    {
        char c;
        scanf("%c",&c);
        if(c >= 'a' && c <= 'z')
        {
            int idx = c - 'a' + 1;
            a[idx] ++ ;
        }
        else if(c >= 'A' && c <= 'Z')
        {
            int idx = c - 'A' + 1;
            a[idx] ++ ;
        }
    }
    for(int i = 1;i <= 26;i ++ )
    {
        if(a[i] == 0)
        {
            flag = 0;
            break;
        }
    }
    if(flag == 1)printf("YES");
    else printf("NO");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/127136152