Loading

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\) 题,算是进步了吧。。。

posted @ 2026-05-03 11:30  heffo_hard  阅读(23)  评论(0)    收藏  举报