ABC456
这次只切了ABC三题。
A
这个题很水,只需要判断一下 \(X\) 的大小是否在 \(3-18\) 之间即可。
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
cin >> n;
puts((n<=18&&n>=3)?"Yes":"No");
return 0;
}
B
首先算出所有可能的情况数,然后除以 \(6^3=216\) 即可,注意保留 \(10\) 位小数。
#include<bits/stdc++.h>
using namespace std;
int a[5][15],t;
map<int,int>mp[5];//记录每个骰子的4,5,6数量
int main(){
for(int i=1;i<=3;++i)
for(int j=1;j<=6;++j){
cin>>a[i][j];
if(a[i][j]==4||a[i][j]==5||a[i][j]==6)mp[i][a[i][j]]++;
}
t+=mp[1][4]*mp[2][5]*mp[3][6];
//4 5 6
t+=mp[1][4]*mp[2][6]*mp[3][5];
//4 6 5
t+=mp[1][5]*mp[2][4]*mp[3][6];
//5 4 6
t+=mp[1][5]*mp[2][6]*mp[3][4];
//5 6 4
t+=mp[1][6]*mp[2][4]*mp[3][5];
//6 4 5
t+=mp[1][6]*mp[2][5]*mp[3][4];
//6 5 4
printf("%.10lf",t*1.0/216);
return 0;
}
C
我们可以分块解决,如果有两个相邻字符相同,就分开,最后把各部分的答案加起来就是答案。
需要注意这个字符串本身满足条件的情况。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MOD=998244353;
string s;
int ans,l,m;
signed main(){
cin >> s;
m=s.size();
s+=" ";
for(int i=1;i<s.size();++i){
l++;
if(s[i]==s[i-1]){
ans+=l*(l+1)/2;
l=0;
ans%=MOD;
}
}
ans+=l*(l+1)/2;
cout << ans%MOD << endl;
return 0;
}
我当时被取模卡了半天。
总结
这次切了 ABC,比上次切 AB 多了 \(1\) 题,算是进步了吧。。。

浙公网安备 33010602011771号