A. Beautiful string
>> face <<
Strategy: 模拟填abc, 总有可行解
#include <bits/stdc++.h>
using namespace std;
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define _rof(i, a, b) for (int i = (a); i > (b); --i)
#define oo 0x3f3f3f3f
#define ll long long
#define db double
#define eps 1e-8
#define bin(x) cout << bitset<10>(x) << endl;
#define what_is(x) cerr << #x << " is " << x << endl
#define met(a, b) memset(a, b, sizeof(a))
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
int nxt() {
int ret;
scanf("%d", &ret);
return ret;
}
const double pi = acos(-1.0);
const int maxn = 1e5 + 10;
char ch[3]{'a','b','c'};
signed main() {
int t = nxt();
while(t--){
string a;
cin >> a;
bool okay = 1;
_for(i, 1, a.size()){
if(a[i] == a[i-1] && a[i] != '?'){
okay = 0;
break;
}
}
if(okay){
_for(i, 0, a.size()){
if(a[i] == '?'){
for(int k = 0;;k++){
if( i >= 1 && ch[k%3] == a[i-1])continue;
if( i < a.size() && ch[k%3] == a[i+1])continue;
a[i] = ch[k%3];
if(i == a.size() - 1 || a[i+1] != '?')break;
if(i < a.size() -1)i++;
}
}
}
cout << a << endl;
}else cout << -1 << endl;
}
}
B. Beautiful Numbers
>> face <<
Strategy: 从1开始维护含有1的连续的区间, 判断区间长度是否等于目前的i,
#include <bits/stdc++.h>
using namespace std;
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define _rof(i, a, b) for (int i = (a); i > (b); --i)
#define oo 0x3f3f3f3f
#define ll long long
#define db double
#define eps 1e-8
#define bin(x) cout << bitset<10>(x) << endl;
#define what_is(x) cerr << #x << " is " << x << endl
#define met(a, b) memset(a, b, sizeof(a))
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
int nxt()
{
int ret;
scanf("%d", &ret);
return ret;
}
const double pi = acos(-1.0);
const int maxn = 2e5 + 10;
int pos[maxn], a[maxn];
signed main()
{
int t = nxt();
while (t--)
{
int n = nxt();
_rep(i, 1, n)
{
a[i] = nxt();
pos[a[i]] = i;
}
int l = pos[1], r = pos[1];
string res;
_rep(i, 1, n)
{
l = min(l, pos[i]);
r = max(r, pos[i]);
if (r - l + 1 == i)
res += "1";
else res += "0";
}
cout << res << endl;
}
}
C. Beautiful Regional Contest
>> face <<
Strategy : 从一半的位置贪, 而且有且仅有最大奖牌数是金, 剩下的要么是银要么是铜, 然后找银和铜的最小值最大, 判断是不是比金还大, 然后记录就完了
#include <bits/stdc++.h>
using namespace std;
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define _rof(i, a, b) for (int i = (a); i > (b); --i)
#define oo 0x3f3f3f3f
#define ll long long
#define db double
#define eps 1e-8
#define bin(x) cout << bitset<10>(x) << endl;
#define what_is(x) cerr << #x << " is " << x << endl
#define met(a, b) memset(a, b, sizeof(a))
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
int nxt()
{
int ret;
scanf("%d", &ret);
return ret;
}
const double pi = acos(-1.0);
const int maxn = 2e5 + 10;
int pos[maxn], a[maxn];
signed main()
{
int t = nxt();
while (t--)
{
int n = nxt();
map<int, int> mat;
vector<int> kind, sum(n);
_rep(i, 1, n){
a[i] = nxt();
if(mat[a[i]] == 0)kind.push_back(a[i]);
mat[a[i]]++;
}
int mid = n/2;
if(mid < 3){
cout << "0 0 0" << endl;
continue;
}
int g = 0, s = 0, b = 0, l = 0, r = find(kind.begin(), kind.end(), a[mid]) - kind.begin();
if(a[mid] == a[mid+1])r--;
sum[0] = 0;
_rep(i, 1 , r){
sum[i] = sum[i-1]+mat[kind[i]];
}
g = mat[kind[l]];
int max_min = 0;
for(int i = l+1;i <= r;i++){
int ss = sum[i], bb = sum[r] - sum[i];
if(max_min > min(ss, bb))break;
max_min = min(ss, bb);
s = ss, b = bb;
}
if(max_min <= g)
cout << "0 0 0" << endl;
else cout << g << " " << s << " " << b << endl;
}
}
D. Beautiful Sequence
>> face <<
拦住我的水题
Strategy: 由于条件满足 ∣ a i − a i + 1 ∣ = 1 |a_i-a_{i+1}| = 1 ∣ai−ai+1∣=1,且相邻两个数不同, 就可以想到是奇数+偶数+奇数+偶数…这样排列了, 所以必须满足 ∣ 奇 数 个 数 − 偶 数 个 数 ∣ ≤ 1 |奇数个数-偶数个数| \leq 1 ∣奇数个数−偶数个数∣≤1,所以可以分情况搞一下,最后判断是否满足另一个限制条件
#include <bits/stdc++.h>
using namespace std;
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define _rof(i, a, b) for (int i = (a); i > (b); --i)
#define oo 0x3f3f3f3f
#define ll long long
#define db double
#define eps 1e-8
#define bin(x) cout << bitset<10>(x) << endl;
#define what_is(x) cerr << #x << " is " << x << endl
#define met(a, b) memset(a, b, sizeof(a))
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
int nxt()
{
int ret;
scanf("%d", &ret);
return ret;
}
const double pi = acos(-1.0);
const int maxn = 2e5 + 10;
int pos[maxn], a[maxn];
signed main()
{
int a = nxt(), b = nxt(), c = nxt(), d = nxt();
int n = a + b + c + d;
int cnt_odd = b+d, cnt_even = c + a;
if(fabs(cnt_even - cnt_odd) > 1){
cout << "NO" << endl;
return 0;
}
vector<int> res(n);
if(cnt_even >= cnt_odd){//
_for(i, 0, n){
if(i%2 == 0){
if(a){
res[i] = 0;
a--;
continue;
}else {
res[i] = 2;
c--;
continue;
}
}else {
if(b){
res[i] = 1;
b--;
continue;
}else {
res[i] = 3;
d--;
continue;
}
}
}
}else {
_for(i, 0, n){
if(i%2 == 0){
if(b){
res[i] = 1;
b--;
continue;
}else {
res[i] = 3;
d--;
continue;
}
}else {
if(a){
res[i] = 0;
a--;
continue;
}else {
res[i] = 2;
c--;
continue;
}
}
}
}
bool okay = 1;
_for(i, 0, n-1){
if(fabs(res[i] - res[i+1]) >1){
okay = 0;
break;
}
}
if(!okay){
cout << "NO" << endl;
return 0;
}
cout << "YES" << endl;
for(auto i: res){
cout << i << " ";
}
}
E
E. Beautiful Mirrors
>> face <<
拦住我的好题(概率dp)
Strategy: 令dp[i]为,到第i面镜子的且happy的期望天数
d
p
[
i
]
=
p
[
i
]
100
×
(
d
p
[
i
−
1
]
+
1
)
+
100
−
p
[
i
]
100
×
(
d
p
[
i
−
1
]
+
1
+
d
p
[
i
]
)
dp[i] = \frac{p[i]}{100}\times (dp[i-1]+1) + \frac{100 - p[i]}{100}\times(dp[i-1]+1+dp[i])
dp[i]=100p[i]×(dp[i−1]+1)+100100−p[i]×(dp[i−1]+1+dp[i])
然后化简
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define _rof(i, a, b) for (int i = (a); i > (b); --i)
#define oo 0x3f3f3f3f
#define ll long long
#define db double
#define eps 1e-8
#define bin(x) cout << bitset<10>(x) << endl;
#define what_is(x) cerr << #x << " is " << x << endl
#define met(a, b) memset(a, b, sizeof(a))
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
const int mod = 998244353;
int nxt()
{
int ret;
scanf("%d", &ret);
return ret;
}
const double pi = acos(-1.0);
const int maxn = 2e5 + 10;
ll qpow(ll a, ll b){ ll ret = 1; for(;b;b>>=1, a= a*a%mod) if(b&1)ret = ret *a%mod; return ret;}
ll inv(ll x){return qpow(x, mod - 2);}
signed main()
{
int n = nxt();
vector<ll> dp(n+1), p(n + 1);
_rep(i, 1, n)p[i] = nxt();
_rep(i, 1, n){
dp[i] = (100*(dp[i-1]+1)%mod)*qpow(p[i], mod-2)%mod;
}
cout << dp[n] << endl;
}