首页 > 其他分享 >P9183 [USACO23OPEN] FEB B 题解

P9183 [USACO23OPEN] FEB B 题解

时间:2024-03-02 17:14:08浏览次数:22  
标签:USACO23OPEN FEB int 题解 可以 下界 次数 靠边

由于只需要考虑相邻的位置,所以每一段连续的 F 是互不影响的,可以分别进行考虑。而连续的一段 F 又可以分成两类:靠边的和被夹在中间的。

靠边的 F 段较为简单,假定有 \(c\) 个 F ,不难发现只要让 EB 交错出现就可以达到最少次数 ,而让所有的 F 都变成最近的非 F 就可以达到最多次数 \(c\),由内向外减少交错的长度就可以逐渐增加次数,使得 \([0,c]\) 中的任意次数都是可行的。

夹在中间的 F 段稍微复杂一些,段的长度与两边字符的异同都会影响答案,不过还是可以先用贪心按顺序考虑每个 F ,分别尽量保持不同尽量保持不变就可以求出最少次数 \(l\) 和最大次数 \(r\)。接下来再进行调整并观察可能的次数,不难发现每次调整都会使得答案刚好变化 \(2\)。

综上所述,我们可以对每一段的下界和上界分别进行累加,就得到了最终答案的下界与上界。若只有夹在中间的 F 段,那么次数变化的步长为 \(2\),否则只要有任意靠边的 F 段,就可以让变化的步长变成 \(1\),由此可以算出次数的数量,最后进行输出即可。

实现时不需要分段进行处理,通过判断首字母与末字母是否为 F 就可以知道是否有靠边的段,然后直接贪心求解上下界即可。

时间复杂度 \(O(n)\)。

#include<bits/stdc++.h>
using namespace std;

int n;
int l,r,d;
string s,t;

int main(){
    cin>>n>>s,t=s;
    d=2-(s[0]=='F'||s[n-1]=='F');
    for(;r<n-1&&s[r]=='F';r++);
    for(int i=r+1;i<n;i++){
        if(s[i]=='F')
            t[i]=t[i-1],s[i]=(s[i-1]=='E'?'B':'E'); 
        l+=(s[i]==s[i-1]),r+=(t[i]==t[i-1]); 
    } 
    cout<<(r-l)/d+1<<'\n';
    for(int i=l;i<=r;i+=d) cout<<i<<'\n';
    return 0;
}

标签:USACO23OPEN,FEB,int,题解,可以,下界,次数,靠边
From: https://www.cnblogs.com/XOF-0-0/p/18048894

相关文章

  • P3671 [USACO17OPEN] Where's Bessie? S 题解
    我们先枚举所有子矩阵,验证其在不考虑重叠的情况下是否为PCL矩阵(dfs求一遍联通块即可)。然后将所有满足条件的矩阵存下来,最后朴素判断每个矩阵是否被其他矩阵包括,若没有矩阵包括它,则其对于答案的贡献为\(1\),累加所有贡献即为最终结果。时间复杂度是\(O(n^6)\)的。思路很简......
  • P1874 快速求和 题解
    updon2023/12/22:修改了代码,现已通过所有hack数据。首先定义状态:令\(dp_{i,j}\)表示前\(i\)个数字要变成\(j\)所需要的最少加号个数。同时,我们还需要一个辅助数组:令\(num_{i,j}\)表示\(i\simj\)的数字组成的数(不添加加号)。然后进行转移。显然可以枚举......
  • AT_dp_z Frog 3 题解
    这题的朴素dp是显然的。令\(dp_i\)表示跳到第\(i\)个石头的最小花费,有转移方程:\[dp_i=\min_{j=1}^{i-1}\{dp_j+(h_i-h_j)^2+C\}\]直接转移是\(O(n^2)\)的,考虑优化。首先对于\(\min\)以内的式子化简,得:\[dp_j+h_i^2+h_j^2-2h_ih_j+C\]将与\(j\)无关的项剔除,得:\[d......
  • 喵了个喵 题解
    传送门这玩意是T2???观察到\(k=2n-2\)或\(k=2n-1\),所以我们可以尝试让每个栈里面都保持两张牌。同时保留一个空栈,用来消栈底。记这个保留的空栈为\(sp\)。策略1:如果当前牌堆顶的牌能消,必然消;否则除了\(sp\),如果存在一个没有填到两张牌的栈,放进去。当\(k=2n-1\)......
  • CF1915D Unnatural Language Processing 题解
    容易发现音节的划分不仅要求子串形如\(\texttt{CV}\)或\(\texttt{CVC}\),并且接下来的两个字符也必须是\(\texttt{CV}\),不然会导致无法划分下去。于是我们遍历字符串,找出所有满足上述条件的子串,记录需要输出\(\texttt{.}\)的位置即可。实现:intn;strings,ans,t="";cin>......
  • CF1915E Romantic Glasses 题解
    我们考虑维护\(sum_i\)表示前\(i\)个数中偶数下标的数之和与奇数下标的数之和之差,其中\(sum_0=0\)。若在某一时刻,有\(sum_i=sum_j(j<i)\),说明\(j\simi\)中偶数下标的数之和与奇数下标的数之和之差为\(0\)。这个使用map判断即可。实现:intn,f=0;cin>>n;m.clear()......
  • CF1921D Very Different Array 题解
    补充一个对本题贪心思路更(?)清楚的解释。本题贪心思路:在\(a_i,b_i\)分别升序的情况下,对于每个\(a_i\),与它差值最大的\(b_i\)只可能出现在\(b_{n-i+1}\)与\(b_{m-i+1}\)这两者中。证明:首先,假设我们有一个长度为\(n\)的升序序列\(s\)。则对于\(s_1\),与它差值最大......
  • CF10E 题解
    传送门有\(n\)种货币。找一个最小的金额\(x\),使得贪心法付款不是最优解;如果贪心法始终都是最优解,输出\(-1\)。\((n\le400)\)将货币集合记作一个\(n\)维向量\(C=(c_1,c_2,\dots,c_n)\)。对于金额\(x\)的一个表示法,也记作一个\(n\)维向量\(V\)。即\(C\timesV=x\)。......
  • NOIP2023 T4 题解
    T4写出转移方程:\(f_i\)表示前\(i\)天且第\(i\)天必须跑的最大能量值。\(g_i=\max\limits_{j=1}^i\{f_j\}\)。初值\(f_0=g_0=0\)。对于转移方程,考虑枚举最后一段跑的段是从哪里开始的:\(f_i=\displaystyle\max_{j=i-k+1}^i(g_{j-2}+prize(j,i)-(j-i+1)\timesd)\)。其中\(p......
  • SP14846 GCJ1C09C - Bribe the Prisoners 题解
    非常好区间dp。我们发现直接依题做是困难的,因此考虑反着做。也即,假定起初那\(Q\)个牢房均为空,现在要将给定的\(Q\)的犯人插入其中,求最小代价。然后我们发现这题和P1775很像,相当于每插入一个人,两段不相邻的牢房就被合并到了一起。接着我们就考虑这玩意怎么做区间dp。......