语法周赛 Round 16 题解
2024年12月25日大约 6 分钟
A.WOTOJO 型字符串
分析
- 难度:基础条件判断。
- 子任务 1(30 分):输出
Yes
即可。 - 子任务 2(30 分):此时只需要判断
都不同即可。 - 子任务 3(40 分):因为保证了字符串长度为
,所以直接用 个字符输入配合条件判断即可。正常堆if
判断就好。语法周赛第一题保证了只需要用到条件判断,不会超纲的。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a, b, c, d, e, f;
cin >> a >> b >> c >> d >> e >> f;
if (b == d && d == f &&
a != b && a != c && a != e &&
b != c && b != e &&
c != e)
cout << "Yes";
else
cout << "No";
return 0;
}
B. 疯疯疯狂星期四
分析
- 难度:经典日期循环模拟题。
- 子任务 1(30 分):直接把样例输出前三行拿过来输出即可。
- 子任务 2(30 分):利用样例数据配合条件判断完成即可。
- 子任务 3(40 分):循环一天天过就好,比较基础的日期模拟题,与之类似的经典题有《A0274 黑色星期五》。这里为了避免使用循环后面的知识点,每个月的天数我是用条件判断实现的。实际上利用数组记好二月之外的天数,然后封装成一个小函数代码会更简洁。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
int n;
// 年份、月份、日期、星期几
int yy, mm, dd, ww;
int main()
{
int n;
cin >> n;
// 一天天模拟
yy = 2024;
mm = 4;
dd = 4;
ww = 4;
while (n)
{
if (yy % 10 == 4 && mm == 4 && dd == 4 && ww == 4)
{
cout << yy << " " << mm << " " << dd << "\n";
n--;
}
// 这个月的天数
int maxDay;
if (mm == 4 || mm == 6 || mm == 11 || mm == 9)
maxDay = 30;
else if (mm != 2)
maxDay = 31;
else if (yy % 4 == 0 && yy % 100 != 0 || yy % 400 == 0)
maxDay = 29;
else
maxDay = 28;
// 过一天
dd++;
if (dd > maxDay)
{
mm++;
dd = 1;
}
if (mm > 12)
{
yy++;
mm = 1;
}
ww++;
if (ww > 7)
ww = 1;
}
return 0;
}
C. TooY0ung的WrongAnswer 2.0
分析
- 难度:贪心,循环,条件判断,字符串
- 题解:首先就是这个题目要想明白几个事情:
- 1.题目中所写的恰好
次操作,其实应该是计算最少几次操作可以让原字符串中出现 ,这里我们设为 ,那么应该是只要满足 ,应该是都可以满足,因为多出的操作次数可以通过 胡乱排序、或者 胡乱转换大小写 把多余的次数浪费掉。 - 2.题目中的排序最多只需要进行一次,因为排序是随意的,所以既然排序了肯定是要把自己要的东西,通过一次排序都搞好。
- 3.想明白了这些之后,接下来的问题就是想办法把
里面的每种字母个数进行统计就行了,这里给出两种方法,第一种就是没什么技术含量的开很多个变量进行统计就好了,第二种的话就是用桶来统计,个人还是很推荐第二种方法,然后优先查找 ,能查到就在这个里面优先查,查不到就去 里面查即可,统计次数即可。 - 4.注意一个
贴心准备的很坑的数据点: 很多错误的写法都会认为不需要排序,所以很输出“Yes”,那么就错了,嘿嘿。
满分参考代码1
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define eps 1e-10
#define INF 1e9
#define delta 0.996
#define T 3000
#define pi acos(-1.0)
#define ld long double
using namespace std;
const ll mod1=1e9+7;
const ll mod2=998244353;
const int maxn=1e6 + 10;
const ll inf=1e18L;
typedef pair<int,int>P;
using namespace std;
//WrongAnswer
//w : 2
//r : 2
//n : 2
string ss, wa = "WrongAnswer";
int x, W, w, r, R;
int o, O, n, N, g, G, A, a, s, S, e, E, sum;
int main()
{
cin >> ss >> x;
int len = (int) ss.size();
ss = " " + ss;
for(int i = 1; i <= len; i++)
{
if(ss[i] == 'W') W++; if(ss[i] == 'w') w++;
if(ss[i] == 'R') R++; if(ss[i] == 'r') r++;
if(ss[i] == 'O') O++; if(ss[i] == 'o') o++;
if(ss[i] == 'N') N++; if(ss[i] == 'n') n++;
if(ss[i] == 'G') G++; if(ss[i] == 'g') g++;
if(ss[i] == 'A') A++; if(ss[i] == 'a') a++;
if(ss[i] == 'S') S++; if(ss[i] == 's') s++;
if(ss[i] == 'E') E++; if(ss[i] == 'e') e++;
}
if(W + w < 2 || R + r < 2 || O + o < 1 || N + n < 2 || G + g < 1 || A + a < 1 || S + s < 1 || E + e < 1)
{
puts("No");
return 0;
}
if(W == 0) sum++;
if(w == 0) sum++;
if(r == 0) sum += 2;
if(r == 1) sum++;
if(o == 0) sum++;
if(n == 0) sum += 2;
if(n == 1) sum++;
if(g == 0) sum++;
if(A == 0) sum++;
if(s == 0) sum++;
if(e == 0) sum++;
if(sum > x)
{
puts("No");
return 0;
}
else if(sum < x)
{
puts("Yes");
return 0;
}
else
{
if(x == 0)
{
if(ss.find("WrongAnswer")==ss.npos)
{
puts("No");
return 0;
}
else
{
puts("Yes");
return 0;
}
}
int flag = 0;
for(int i = 1; i <= len - 10; i++)
{
int ans = 0;
for(int j = 0; j <= 10; j++)
{
if((j == 0 || j == 5) && ss[i + j] != wa[j] && ss[i + j] != wa[j] + 32)
{
break;
}
if(((j >= 1 && j <= 4) || (j >= 6 && j <=10)) && ss[i + j] != wa[j] && ss[i + j] != wa[j] - 32)
{
break;
}
if((j == 0 || j == 5) && ss[i + j] != wa[j] && ss[i + j] == wa[j] + 32)
ans++;
else if(((j >= 1 && j <= 4) || (j >= 6 && j <=10)) && ss[i + j] != wa[j] && ss[i + j] == wa[j] - 32)
ans++;
}
if(ans == x)
{
puts("Yes");
flag = 1;
return 0;
}
}
if(flag == 0)
{
puts("No");
return 0;
}
}
return 0;
}
满分参考代码2
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define eps 1e-10
#define INF 1e9
#define delta 0.996
#define T 3000
#define pi acos(-1.0)
#define ld long double
using namespace std;
const ll mod1=1e9+7;
const ll mod2=998244353;
const int maxn=1e6 + 10;
const ll inf=1e18L;
typedef pair<int,int>P;
using namespace std;
//WrongAnswer
//w : 2
//r : 2
//n : 2
string ss, wa = "WrongAnswer", wawa = "wRONGaNSWER";
int mp[130];
int x, cnt, flag = 1;
int main()
{
cin >> ss >> x;
int len = (int) ss.size();
ss = " " + ss;
string sss = ss;
for(int i = 1; i <= len; i++)
{
mp[ss[i]]++;
}
for(int i = 1;i <= len; i++)
{
if(ss[i] >= 'A' && ss[i] <= 'Z') ss[i] += 'a'-'A';
}
if(ss.find("wronganswer")==ss.npos) cnt++;
for(int i = 0; i <= 10; i++)
{
if(mp[wa[i]] >= 1) mp[wa[i]]--;
else if(mp[wawa[i]] >= 1) cnt++, mp[wawa[i]]--;
else
{
flag = 0;
puts("No");
return 0;
}
}
if(x == 0)
{
if(sss.find("WrongAnswer")==sss.npos)
{
puts("No");
return 0;
}
else
{
puts("Yes");
return 0;
}
}
if(cnt > x) puts("No");
else puts("Yes");
return 0;
}
D. 坏掉的数码管
分析
- 难度:模拟、基础组合数学(乘法原理)
- 子任务 1(30 分):只有一个数码管,利用题面给的代码,给大家提供了
对应的字符串。一一比对可能是哪些即可,显然只要所有输入的Y
的位置,数字对应的也是Y
即可。一旦出现了输入的某一位是Y
,但是当前判断的这个数字的这一位不是Y
,那就不可能是当前数字了。 - 子任务 2(30 分):可以枚举所有两位数,一一判断。但实际上子任务 2 是一个提示性的子任务,很容易想到就是第一位可能的数量乘以第二位可能的数量。
- 子任务 3(40 分):利用子任务 2 很容易被提示乘法原理。把每一位可能的数量相乘即可。因为
是每一根发光二极管都亮着,所以显然不会有无解情况。需要注意本题模数是 而不是
满分参考代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MOD = 988244353;
string s[10] = {
"YYYYYYN", "NYYNNNN", "YYNYYNY", "YYYYNNY", "NYYNNYY",
"YNYYNYY", "YNYYYYY", "YYYNNNN", "YYYYYYY", "YYYYNYY"};
int n;
// 检查 a 是否可能是 b 换掉几个之后的结果
bool check(string &a, string &b)
{
for (int i = 0; i < 7; i++)
if (a[i] == 'Y' && b[i] == 'N')
return false;
return true;
}
signed main()
{
cin >> n;
int ans = 1;
for (int i = 1; i <= n; i++)
{
string temp;
cin >> temp;
int nowCnt = 0; // 当前位有几种可能
for (int i = 0; i < 10; i++)
if (check(temp, s[i]))
nowCnt++;
ans = (ans * nowCnt) % MOD;
}
cout << ans;
return 0;
}