Beautiful string(rms2017模拟1-1)*【推理】

来源:互联网 发布:祝福婚姻的诗句知乎 编辑:程序博客网 时间:2024/06/06 20:10

Beautiful string(bs.cpp)
试题描述
WSM 认为 O 和 X 是最优美的两个字母,由它们组成的串最优美。在这些最优美的串
中,如果任意只包含X的子串,长度不超过maxX,任意只包含O的子串,长度不超过maxO, 且整个串最多有 countO个O,countX个X。那么这个就是超级优美无敌串。 现在WSM想知道最长的超级优美无敌串有多长,希望你能告诉她。
输入格式
输入包含多行,至文件结束为止; 每行四个数,依次是 CountO、CountX、maxO、maxX。
输出格式
每组数据输出一行,一个数表示最长的超级优美无敌串的长度。
数据规模
0<=CountO,CountX,maxO,maxX<=1000000
输入样例
10 10 0 0 3 5 1 1
输出样例
0 7
注意事项: 第二个样例的解释:“XOXOXOX”. 最多 1000 组数据,其中 30%的数据 0<=CountO,CountX,maxO,maxX<=20,且数据组数
不超过 20 组。

题解
如果maxO是零的话,说明就只有一段X。答案就是maxX,maxX是零也是同理。
现在考虑剩余的情况 ,我们先假设X不够用,说明就算是每次放maxO个O,然后用一个X把它们隔开,这种情况X还是不够用。
OOO…OOOXOOO…OOOXOOO…OOO…;
也就是说:CountO > (CountX+1) * maxO;
那么答案最大就只有可能是CountX + (CountX+1) * maxO。
同理O不够的情况也是如此。对于剩下的情况,答案就是CountX + CountO。值得注意的是,在计算(CountX + 1) * maxO的时候可能会超过int范围,所以建议使用除法来比较大小(用整除更好)。

时间复杂度:O(1) // 单组数据
空间复杂度:O(1)

代码

#include<bits/stdc++.h>#define F(i,a,b) for( int i=(a);i<=(b);i++ )#define N 101#define M 10001#define LL long long#define oo 0x7fffffffusing namespace std;LL read(){    LL f=1,s=0;    char ch=getchar();    while( ch>'9' || ch<'0' ) { if( ch=='-' ) f=-1; ch=getchar(); }    while( ch<='9' && ch>='0' ) { s=( s<<1 )+( s<<3 )+ch-'0'; ch=getchar(); }    return f*s;}LL m,n,k;LL tot,cnt,ans;LL cnt_o,cnt_x,max_o,max_x;int main(){    freopen( "bs.in","r",stdin );    freopen( "bs.out","w",stdout );    while(cin>>cnt_o)    {        cnt_x=read();        max_o=read();        max_x=read();        if( cnt_o==0 || max_o==0) ans=min( cnt_x,max_x );        else if( cnt_x==0 || max_x==0 ) ans=min( cnt_o,max_o );        else        {            LL a1=cnt_o+( cnt_o+1 )*max_x;            LL a2=cnt_x+( cnt_x+1 )*max_o;            ans=min( a1,a2 );            tot=cnt_o+cnt_x;            if( ans>tot ) ans=tot;        }         cout<<ans<<endl;    }    return 0;}