1.Long Loong
AtCoder - abc336_a
问题陈述
对于一个正整数 XX,级别为 XX 的 龙字符串 是一个长度为 (X+3)(X+3) 的字符串,由一个 L
、XX 次出现的 o
、一个 n
和一个 g
按此顺序排列而成。
给定一个正整数 NN。打印级别为 NN 的龙字符串。
注意,大写字母和小写字母是有区别的。
约束条件
- 1≤N≤20241≤N≤2024
- NN 是一个整数。
输入
输入通过标准输入以以下格式给出:
NN
输出
打印级别为 NN 的龙字符串。
分析
依次打印'L',n个'o',"ng"
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll n;
cin >> n;
cout << 'L';
while(n>0){
cout << 'o';
n--;
}
cout << "ng";
return 0;
}
2.YES or YES?
问题描述
有一个长度为 33 的字符串 ss,由大写和小写英文字母组成。检查它是否等于 "YES"(不带引号),其中每个字母可以是任意大小写。例如,"yES"、"Yes"、"yes" 都是允许的。
输入
输入的第一行包含一个整数 tt (1≤t≤1031≤t≤103) — 测试用例的数量。
每个测试的描述由一行组成,该行包含一个由三个字符组成的字符串 ss。ss 的每个字符都是大写或小写英文字母。
输出
对于每个测试用例,如果 ss 满足条件,则输出 "YES"(不带引号),否则输出 "NO"(不带引号)。
你可以以任意大小写输出 "YES" 和 "NO"(例如,字符串 "yES"、"yes" 和 "Yes" 都会被识别为积极响应)。
示例
Inputcopy | Outputcopy |
---|---|
10 YES yES yes Yes YeS Noo orZ yEz Yas XES | YES YES YES YES YES NO NO NO NO NO |
注意
前五个测试用例包含字符串 "YES"、"yES"、"yes"、"Yes"、"YeS"。这些都等于 "YES",其中每个字符可以是大写或小写。
分析
将输入的字母字符串全部转换成小写,判断得到的字符串是否与"yes"相同
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
char s[]="yes";
while(n--){
char ss[3];
cin >> ss;
for(int i=0;i<3;i++){
if('A'<=ss[i] && ss[i]<='Z'){
ss[i]+=32;
}
}
if(strcmp(ss,s)==0){
cout << "YES\n" << endl;
}else{
cout << "NO" << endl;
}
}
return 0;
}
3.Even? Odd? G
洛谷 - P2955
Description
Bessie’s cruel second grade teacher has assigned a list of N (1 <= N <= 100) positive integers I (1 <= I <= 10^60) for which Bessie must determine their parity (explained in second grade as ‘Even… or odd?’). Bessie is overwhelmed by the size of the list and by the size of the numbers. After all, she only learned to count recently.
Write a program to read in the N integers and print ‘even’ on a single line for even numbers and likewise ‘odd’ for odd numbers.
POINTS: 25
Bessie那惨无人道的二年级老师搞了一个有 N 个正整数 I 的表叫Bessie去判断“奇偶性”(这个词语意思向二年级的学生解释,就是“这个数是单数,还是双数啊?”)。Bessie被那个表的长度深深地震惊到了,竟然跟栋栋的泛做表格一样多道题!!!毕竟她才刚刚学会数数啊。
写一个程序读入N个整数,如果是双数,那么在单立的一行内输出"even",如果是单数则类似地输出"odd".
数据范围:每个正整数不超过 10601060。
Input
* Line 1: A single integer: N
* Lines 2…N+1: Line j+1 contains I_j, the j-th integer to determine even/odd
Output
* Lines 1…N: Line j contains the word ‘even’ or ‘odd’, depending on the parity of I_j
Sample 1
Inputcopy | Outputcopy |
---|---|
2 1024 5931 | even odd |
Hint
Two integers: 1024 and 5931
1024 is eminently divisible by 2; 5931 is not
分析
由于所给的正整数可能很大,故用string读取,判断最后一个字符的奇偶性即可
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i=0;i<n;i++){
char num[65];
cin >> num;
int len=strlen(num);
if(num[len-1]%2==0){
cout << "even\n";
}else{
cout << "odd\n";
}
}
return 0;
}
4.Problem Generator
CodeForces - 1980A
Vlad计划下个月举办mm轮比赛。每一轮比赛应包含难度等级为'A', 'B', 'C', 'D', 'E', 'F', 和 'G' 的一个问题。
Vlad已经准备了nn个问题,其中第ii个问题的难度等级为aiai。可能这些问题数量不够,所以他可能需要再想出一些问题。
Vlad希望尽可能少地想出问题,因此他请你找出他需要想出的问题的最少数量,以便举办mm轮比赛。
例如,如果m=1m=1,n=10n=10,a=a= 'BGECDCBDED',那么他需要想出两个问题:一个难度等级为'A',一个难度等级为'F'。
输入
第一行包含一个整数tt (1≤t≤10001≤t≤1000) — 测试用例的数量。
每个测试用例的第一行包含两个整数nn和mm (1≤n≤501≤n≤50, 1≤m≤51≤m≤5) — 银行中问题的数量和即将举办的轮数。
每个测试用例的第二行包含一个长度为nn的字符串aa,包含从'A'到'G'的问题难度。
输出
对于每个测试用例,输出一个整数 — 需要想出的问题的最少数量,以便举办mm轮比赛。
示例
Inputcopy | Outputcopy |
---|---|
3 10 1 BGECDCBDED 10 2 BGECDCBDED 9 1 BBCDEFFGG | 2 5 1 |
分析
用map记录每个题型出现的次数,m-mp["题型"]得到的正值表示每个题型还需举办的比赛次数,将七种题型得到的值累加则为最终还需举办的比赛次数
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<char,int>mp;
int t,n,m;
cin >> t;
while(t>0){
mp.clear();
t--;
cin >> n >> m;
while(n>0){
n--;
char ch;
cin >> ch;
mp[ch]++;
}
int count=0;
for(char i='A';i<='G';i++){
if(m-mp[i]>0){
count+=m-mp[i];
}
}
cout << count << endl;
}
}
5.rules
洛谷 - B4012
Background
从前有个荣光的王国,小 A 是其中的国王,他认为一个国家除了法律外还要有一些约定俗成的规则,所以今天他要赐以其规则。
Description
小 A 制定了一些规则,每条规则有一个代号,代号为不超过 109109 的非负整数。
小 A 的国家有 nn 位居民,每位居民每天会且仅会遵守 11 条规则。小 A 记录了 mm 天里每天每位居民遵守的规则代号。
现在小 A 想要考察代号为 kk 的规则是否符合民意,具体考察方法如下:
- 如果在某一天里,有大于等于一半的人遵守了规则 kk,那么小 A 认为在这一天规则 kk 是符合民意的。
- 如果在大于等于一半的天数里,规则 kk 符合民意,那么他会认为规则 kk 是正确的。否则,他会认为规则 kk 是错误的。
如果小 A 的规则 kk 是正确的,请你输出 YES
,否则请你输出 NO
。
Input
第一行三个整数 n,m,kn,m,k,分别表示居民总数、记录的天数和小 A 想要考察的规则的代号。
接下来 mm 行,每行 nn 个整数分别表示每个人分别遵守的规则代号。
Output
一行一个字符串 YES
或 NO
表示小 A 的规则 kk 是否是被视作正确的。
Sample 1
Inputcopy | Outputcopy |
---|---|
3 2 1 1 1 2 3 1 2 | YES |
Sample 2
Inputcopy | Outputcopy |
---|---|
2 2 1 1 2 2 1 | YES |
Sample 3
Inputcopy | Outputcopy |
---|---|
3 2 1 9 9 8 1 9 9 | NO |
数据范围
- 对于 20%20% 的数据,m=1m=1。
- 对于另外 20%20% 的数据,n=1n=1。
- 对于 100%100% 的数据,1≤n,m≤10001≤n,m≤1000,0≤k≤1090≤k≤109,输入的所有数据 xx 满足 0≤x≤1090≤x≤109。
分析
先统计每单独一天遵守指定规则的人数,判断是否大于等于一半的人,是则符合民意的天数+1,最后判断符合民意的天数是否大于等于总天数的一半
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,t;
cin >> n >> m >> t;
int d=0;
for(int i=1;i<=m;i++){
int count=0;
for(int j=1;j<=n;j++){
int x;
cin >> x;
if(x==t)count++;
}
if(count>=(n+1)/2)d++;
}
if(d>=(m+1)/2){
cout << "YES";
}else{
cout << "NO";
}
return 0;
}
6.Many Replacement
AtCoder - abc342_c
问题陈述
给定一个长度为 NN 的字符串 SS,由小写英文字母组成。
你将对字符串 SS 执行 QQ 次操作。 第 ii 次操作 (1≤i≤Q)(1≤i≤Q) 由一对字符 (ci,di)(ci,di) 表示,对应以下操作:
- 将字符串 SS 中所有字符 cici 替换为字符 didi。
在所有操作完成后,打印字符串 SS。
约束条件
- 1≤N≤2×1051≤N≤2×105
- SS 是一个长度为 NN 的字符串,由小写英文字母组成。
- 1≤Q≤2×1051≤Q≤2×105
- cici 和 didi 是小写英文字母 (1≤i≤Q)(1≤i≤Q)。
- NN 和 QQ 是整数。
输入
输入通过标准输入以以下格式给出:
NN SS QQ c1c1 d1d1 c2c2 d2d2 ⋮⋮ cQcQ dQdQ
输出
在所有操作完成后,打印字符串 SS。
示例 1
Inputcopy | Outputcopy |
---|---|
7 atcoder 4 r a t e d v a r | recover |
SS 的变化如下: atcoder
→ atcodea
→ aecodea
→ aecovea
→ recover
。 例如,在第四次操作中,字符串 S=S=aecovea
中所有的 a
(第一个和第七个字符)都被替换为 r
,结果为 S=S=recover
。
在所有操作完成后,S=S=recover
,因此打印 recover
。
示例 2
Inputcopy | Outputcopy |
---|---|
3 abc 4 a a s k n n z b | abc |
可能会有操作,其中 ci=dici=di 或 SS 不包含 cici。
示例 3
Inputcopy | Outputcopy |
---|---|
34 supercalifragilisticexpialidocious 20 g c l g g m c m r o s e a a o f f s e t t l d v p k v h x i h n n j i r s i u a | laklimamriiamrmrllrmlrkramrjimrial |
分析
使用map<char,char>,记录每个字符转换后对应的字符
初始化map:开始时每个字符转换后都是自己
每次操作都需要遍历26个字母,因为字母经过转换后对应的字母也可能被转换
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
map<char,char>mp;
int main()
{
int n,q;
char s[maxn];
cin >> n >> s >> q;
for(char ch='a';ch<='z';ch++){
mp[ch]=ch;
}
for(int i=0;i<q;i++){
char c,d;
cin >> c >> d;
for(char ch='a';ch<='z';ch++){
if(mp[ch]==c)mp[ch]=d;
}
}
for(int i=0;i<n;i++){
cout << mp[s[i]];
}
return 0;
}
7.更好的交换
Description
小 S 有一个奇怪的机关拼图。这个拼图可以看作一个 nn 行 nn 列的方阵 AA,第 ii 行第 jj 列的位置上有一个正整数 Ai,jAi,j。
与寻常拼图不同的是,这个机关拼图上的数字不能随意移动,必须按照如下规则之一操作:
- 选择拼图上的第 xx 行和第 yy 行,交换这两行;
- 选择拼图上的第 xx 列和第 yy 列,交换这两列。
为了复原这个拼图,小 S 将会操作共 mm 次,每次操作格式如下:
1 x y
,表示交换第 xx 行和第 yy 行;0 x y
,表示交换第 xx 列和第 yy 列;
请你输出复原后的拼图。
Input
第一行,两个正整数 nn 和 mm,分别表示拼图的行数、列数和总操作次数。
接下来 nn 行,每行 nn 个正整数 Ai,jAi,j,表示拼图上第 ii 行,第 jj 列上的数字。
接下来 mm 行,每行三个正整数 op,x,yop,x,y,其中 opop 表示操作类型,x,yx,y 代表被操作的行号或列号。
Output
输出共 nn 行,每行 nn 个正整数,表示复原后的拼图。
Sample 1
Inputcopy | Outputcopy |
---|---|
3 2 4 5 6 3 2 1 9 8 7 0 2 3 0 2 2 | 4 6 5 3 1 2 9 7 8 |
Sample 2
Inputcopy | Outputcopy |
---|---|
3 2 11 12 13 21 22 23 31 32 33 1 2 3 0 2 3 | 11 13 12 31 33 32 21 23 22 |
Sample 3
Inputcopy | Outputcopy |
---|---|
4 4 12 32 42 82 53 43 34 98 90 32 42 53 37 17 88 10 0 2 4 1 2 4 0 1 4 1 1 3 | 32 53 42 90 17 10 88 37 32 82 42 12 43 98 34 53 |
数据范围
对于前 30%30% 的数据,保证每一行数字相同;
对于前 60%60% 的数据,保证 1≤m≤3×1031≤m≤3×103。
对于 100%100% 的数据,保证 1≤m≤106,1≤n,Ai,j≤103,1≤x,y≤n1≤m≤106,1≤n,Ai,j≤103,1≤x,y≤n,0≤op≤10≤op≤1。
分析
用一个数组表示第i行存储的是初始数组的第几行,列也相同,初始化数组px[]的第i行存储原数组第i行,由于行和列之间的操作互不影响,故交换行时只需要交换px[x]和px[y],对于列的处理方法也相同,最后按顺序打印矩阵
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin >> n >> m;
int a[n+5][n+5];
int row[n+5],col[n+5];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin >> a[i][j];
}
}
for(int i=1;i<=n;i++)row[i]=col[i]=i;
for(int i=0;i<m;i++){
int op,x,y;
cin >> op >> x >> y;
if(op==1){
swap(row[x],row[y]);
}else{
swap(col[x],col[y]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout << a[row[i]][col[j]] << " ";
}
cout << endl;
}
return 0;
}
总结
多做题,多思考,你就不会变差