(核心思路就是分情况讨论)
从整体上对题目进行分析,此题共有三种情况:
(1)0
有一方为0,则结果为另一方的max;
两方都为0,则结果为0;
(2)一方多,另一方不够用,满足((contx+1)*maxo<=counto)
或则((conto+1)*maxx<=countx)
结果为:((contx+1)*maxo+counto) (X不够用)
或则
((cont0+1)*maxx+counto) (O不够用)
也即,不够用的一方即使每次只取一个作为分隔符都不够用的。
比如,20 5 2 2
则最长的超级优美无敌串为:OOXOOXOOXOOXOOXOO
(3)其它情况,则结果为 maxn+maxm
除去(1)(2)两种特殊情况,则其他情况中所有的字母都可以用上。
比如8 6 3 2
则最长的超级优美无敌串为:OOOXXOOOXXOOXX
(我的理解是这样的)
(首先明确一点,最长的串长为maxx+maxo)
(而且这是两种字母刚好用完的情况)
(那我们先考虑一方不够用的情况)
(也就是把少的那个字母每次只用一个作为分隔符依然不够用)
(此时少的字母全部用完,多的字母是最大分割数,肯定最优)
(特殊的,可能存在一方为0的情况,特判)
(其余情况可以全部用完,为maxx+maxo)
#include <iostream>
using namespace std;
int main()
{
long long o,x,maxx,maxo;
while(cin>>maxo>>maxx>>o>>x)
{
if(o==0||maxo==0) cout<<min(maxx,x);
else if(x==0||maxx==0) cout<<min(maxo,o);
else if((maxx+1)*o<maxo) cout<<(maxx+1)*o+maxx;
else if((maxo+1)*x<maxx) cout<<(maxo+1)*x+maxo;
else cout<<maxx+maxo;//全部用完
cout<<endl;
}
return 0;
}