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;
}
posted @ 2020-04-05 09:47  倾叶子佮  阅读(192)  评论(0编辑  收藏  举报