P1620 漂亮字串
\(核心思路就是分情况讨论\)
从整体上对题目进行分析,此题共有三种情况:
(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;
}