目录
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;
}