Educational Codeforces Round 175 (Rated for Div. 2)(ABC D未补)
Educational Codeforces Round 175 (Rated for Div. 2)(ABC)
赛时AB,C没看出来
A
给出n,求0-n中有多少个\sum_{i=0}^{n}(i%3==i%5)
首先,对于最小公倍数,则有n/15*3个,3的倍数,5的倍数,15的倍数
除此以外则只需计算其他的数即可
void solve()
{
int n;
cin>>n;
int cnt = n/15*3;
n%=15;
for(int i = 0;i <= n;i++)
{
cnt += (i%5==i%3);
}
cout<<cnt<<"\n";
}
B
在坐标轴上有一bot位于点$x$(初始不位于0),同时给定时间t,与一个长度为n的字符串(均为L和R),L表示向左移动一格,R表示向右移动一格。bot会依次执行指令直到回到0点或执行完没有回到0点(则会停止),若回到0点则从头开始重复执行指令,求bot在时间t之内会移动到0点多少次
idea:类似一个循环的过程,对于第一次若能回到0,则再遍历一遍看看有没有0点即可,模拟即可
#include<bits/stdc++.h>
\#define N 1005
\#define mod 998244353
using namespace std;
typedef long long ll;
\#define int long long
void solve()
{
int n,x,k;
cin>>n>>x>>k;
string s;
cin>>s;
s = '$'+s;
vector<int>a(n+1);
ll sum = 0;
vector<int>b;
bool flag = 0;
for(int i =1;i<=n;i++)
{
if(s[i] == 'L') a[i] = -1;
else a[i] = 1;
}
for(int i =1;i <= n;i++)
{
sum +=a[i];
if(-sum == x)
{
b.push_back(i);
sum = 0;
flag = 1;
break;
}
}
if(flag == 0) {cout<<"0\n";return;}
for(int i = 1;i <= n;i++)
{
sum+=a[i];
if(sum == 0) b.push_back(i);
}
if(b.size() >= 2) cout<<(k-b[0])/b[1]+1;
else cout<<1;
cout<<"\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T = 1;
cin>>T;
while(T--)
solve();
return 0;
}
C
在一个n个格子的条带上(初始全为红色),可以进行最多k次操作选择一个区间将红色染成蓝色(反之不能操作),同时给定每个格子的目标颜色与惩罚,颜色若不对则有惩罚,惩罚为所有颜色错误的格子中惩罚最大的那个;
idea:赛时没一点想法,3e5不能dp,区间操作也没啥想法(还是太菜了,加训)
赛后:仔细想想,操作次数越多,惩罚越小,同时要使得所有惩罚的最大值最小,这就满足单调性,二分答案求解,注意边界条件即可
枚举最小可能的x,如果遇到惩罚比当前大且颜色不对的,消耗次数,最后根据消耗的次数来修改l和r即可
#include<bits/stdc++.h>
#define N 1005
#define mod 998244353
#define int long long
using namespace std;
typedef long long ll;
void solve()
{
int n,k;
cin>>n>>k;
string s;
cin>>s;
s='$'+s;
vector<int>a(n+1);
for(int i = 1;i <= n;i++)
{
cin>>a[i];
}
auto check = [&](int x)
{
ll res = 0;
bool f = 0;
for(int i = 1;i <= n;i++)
{
if(a[i] <= x) continue;
if(s[i] == 'R' && f) {f = 0;}
if(s[i] == 'B' && !f) {f = 1;res++;}
}
return res <= k;
};
int l = 0, r = 1e9;
while(l < r)
{
int mid = (l+r)/2;
if(check(mid)) r = mid;
else l = mid + 1;
}
cout<<l;
cout<<"\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T = 1;
cin>>T;
while(T--)
solve();
return 0;
}