申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/

2011年10月27日 星期四

[基本練習]OI練習題:漂亮字串 bs

【问题描述

小 x 认为 O 和 X 是最优美的两个字母,由 O 和 X 组成的串是最优美的串。在这些最优美的串中,如果任意只包含 X 的子串,长度不超过 maxX ,任意只包含 O 的子串,长度不超过 maxO ,且整个串最多有 countO 个 O , countX 个 X 。那么这个就是超级优美无敌串。
现在 小 x 想知道最长的优美无敌串有多长,希望你告诉他。
【输入格式】
输入包含多行,每行一组数据,至文件结束为止;
每行四个数,依次是 countO 、 countX , maxO , maxX 。
【输出格式】
每组数据输出一行,一个数表示最长的超级优美无敌串的长度。
【输入样例】
10 10 0 0
3 5 1 1
【输出样例】
0
7
【数据规模】
0<= countO,countX,maxO,maxX<=1000000
最多 1000 组数据。
其中 30% 的数据 0<= countO,countX,maxO,maxX<=20 ,且数据组数不超过 20 组。
【注意事项】
第二个样例的解释:“ XOXOXOX ”
 
【分析】
如果countO或者maxO等於0,直接輸出Min{countX,maxX}。
如果countX或者maxX等於0,直接輸出Min{countO,maxX}。
如果countO等於countX,輸出countO+countX。
如果countO小於countX,輸出Min{maxX*(countO+1),countX}+countX。
如果countO大於countX,輸出Min{maxO*(countX+1),countO}+countX。

【代碼】
#include <iostream>
#include <cstdio>
#include <cstdlib>
//#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:b
using namespace std;

int main()
{
    freopen("bs.in","r",stdin);
    freopen("bs.out","w",stdout);
    int tco,tcx,tmo,tmx;
    long long tmp;
    long long co,cx,mo,mx;
    while(scanf("%d %d %d %d\n",&tco,&tcx,&tmo,&tmx)==4)
    {
        co=tco;
        cx=tcx;
        mo=tmo;
        mx=tmx;
        if(co==0||mo==0)
        {
            tmp=Min(cx,mx);
            cout<<tmp<<endl;
            continue;
        }
        if(cx==0||mx==0)
        {
            tmp=Min(co,mo);
            cout<<tmp<<endl;
            continue;
        }
       
        if(co==cx)
        {
            cout<<co+cx<<endl;
            continue;
        }
        if(co<cx)
        {
            tmp=mx*(co+1);
            tmp=Min(tmp,cx);
            cout<<co+tmp<<endl;
            continue;
        }
        if(co>cx)
        {
            tmp=mo*(cx+1);
            tmp=Min(tmp,co);
            cout<<tmp+cx<<endl;
            continue;
        }
    }
    return 0;
}

沒有留言:

張貼留言