【问题描述】
小 x 认为 O 和 X 是最优美的两个字母,由 O 和 X 组成的串是最优美的串。在这些最优美的串中,如果任意只包含 X 的子串,长度不超过 maxX ,任意只包含 O 的子串,长度不超过 maxO ,且整个串最多有 countO 个 O , countX 个 X 。那么这个就是超级优美无敌串。
小 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;
}
#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;
}
沒有留言:
張貼留言