2019年华南理工大学程序设计竞赛(春季赛)C.六学家的困惑
链接: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∼91∼9的数字,表示两根管子里的小球的数字。每根管子内至少含1个小球,且数量不超过40个。
输出描述:
对每一组数据,输出一行Case #x: A,其中x是数据组数编号(从1开始),A是小六能组成的最大的数。
示例1
输入
复制
2 123456 123456 9876346789 9854894589
输出
复制
Case #1: 665544332211 Case #2: 99998888776655498443
题意:给你两个字符串,每一位只在1-9中
每次可以取这两个字符串中的头或尾
要求最后输出的答案字典序最大
思路:
用string直接比大小
分别是a字符串,b字符串,a的反转字符串,b的反转字符串
然后如果a最大,删去a的第一个字符和c的最后一个字符
其他相似
把答案输入queue,然后输出
string反转:reverse(c.begin(), c.end());
string删除字符:str.erase(pos,k):从第pos位删除k个(pos在0-len-1)
#include <bits/stdc++.h>
using namespace std;
string a,b,c,d;
queue <int> q;
int tmp()
{
if(a>=b&&a>=c&&a>=d)
{
q.push(a[0]-'0');
a.erase(0,1);
int len=c.length();
c.erase(len-1,1);
return 1;
}
else if(b>=a&&b>=c&&b>=d)
{
q.push(b[0]-'0');
b.erase(0,1);
int len=d.length();
d.erase(len-1,1);
return 2;
}
else if(c>=a&&c>=b&&c>=d)
{
q.push(c[0]-'0');
c.erase(0,1);
int len=a.length();
a.erase(len-1,1);
return 3;
}
else
{
q.push(d[0]-'0');
d.erase(0,1);
int len=b.length();
b.erase(len-1,1);
return 4;
}
}
int main()
{
int T;
int cas=0;
scanf("%d",&T);
while(T--)
{
//f1=f2=f3=f4=0;
cin>>a>>b;
int len1=a.length();
int len2=b.length();
c=a,d=b;
reverse(c.begin(), c.end());
reverse(d.begin(), d.end());
for(int i=1;i<=len1+len2;i++)
{
int k=tmp();
}
printf("Case #%d: ",++cas);
while(!q.empty())
{
int k=q.front();
q.pop();
printf("%d",k);
}
cout<<endl;
}
return 0;
}