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;
}
posted @ 2025-02-28 11:37  graspppp  阅读(17)  评论(0编辑  收藏  举报