题目描述
题目链接:https://ac.nowcoder.com/acm/contest/625/C
小六喜欢两全其美的事情,今天就正好有一个这样的机会。
小六面前有两根管子,管子里面放满了数字为1到9的小球。每次取球时,小六会先选择一根管子,再从这根管子的某一侧(左侧或右侧)取出一个球。在满足取球规则的情况下,他可以任意顺序取出所有小球。假如小六依次取出的球的编号为a1,a2,⋯,ana1,a2,⋯,an,则他最后就得到了一个形如a1a2⋯ana1a2⋯an样的十进制数。
小六希望他的取球顺序所组成的数是最大的,你可以帮一下他吗?
输入描述:
第一行输入数据组数。T (T≤14)T (T≤14)接下来T行,每行输入两串只含1∼9
1∼9的数字,表示两根管子里的小球的数字。每根管子内至少含1个小球,且数量不超过40个。
输出描述:
对每一组数据,输出一行Case #x: A,其中x是数据组数编号(从1开始),A是小六能组成的最大的数。
示例1
输入
2
123456 123456
9876346789 9854894589
输出
Case #1: 665544332211
Case #2: 99998888776655498443
看到这题就想到双端队列,想到双端队列我就完了
用string,只需40h , 其实还能再短。
#include<bits/stdc++.h>
using namespace std;
int main() {
freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
string a,b,c,d,ans;
for(int t=1;t<=n;t++) {
cin>>a>>c;
b.clear();
d.clear();
ans.clear();
for(int i=a.size()-1; i>=0; i--)
b+=a[i];
for(int i=c.size()-1; i>=0; i--)
d+=c[i];
while(a.size()||c.size()) {
if(a>=b&&a>=c&&a>=d) {
ans+=a[0];
a.replace(0,1,"");
b.replace(b.size()-1,1,"");
} else if(b>=a&&b>=c&&b>=d) {
ans+=b[0];
b.replace(0,1,"");
a.replace(a.size()-1,1,"");
} else if(c>=a&&c>=b&&c>=d) {
ans+=c[0];
c.replace(0,1,"");
d.replace(d.size()-1,1,"");
} else {
ans+=d[0];
d.replace(0,1,"");
c.replace(c.size()-1,1,"");
}
}
cout<<"Case #"<<t<<": "<<ans<<endl;
}
return 0;
}
思路由xhp提供