1.漂亮字串

【题目描述】

Caima认为O和X是最优美的两个字母,由O、X组成的串是最优美的串。在这些最优美的串中,如果任意只包含X的子串,长度不超过maxX,任意只包含O的子串,长度不超过maxO,且整个串最多有countO个O,countX个X。那么这个就是超级优美无敌串。

现在Caima想知道最长的超级优美无敌串有多长,希望你告诉他。

【输入格式】

输入包含多行,至文件结束为止;

每行四个数,依次是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组

 

 

解析:

从整体上对题目进行分析,此题共有三种情况:

(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

 1 var
 2   countx,counto,maxx,maxo:int64;
 3   procedure main;
 4   begin
 5     if maxo=0  then writeln(maxx)
 6     else
 7       if maxx=0 then writeln(maxo)
 8       else
 9         if (counto+1)*maxx<countx then writeln((counto+1)*maxx+counto)
10         else
11            if (countx+1)*maxo<counto then writeln((countx+1)*maxo+countx)
12            else writeln(countx+counto);
13   end;
14 begin
15   while not eof do
16     begin
17       readln(counto,countx,maxo,maxx);
18       main;
19     end;
20 end.
View Code