题目链接
分析:题意很简单,就是两个双端开口的队列,每次取出每个端口最大的元素。
开始用两个字符串模拟写,但是发现一个问题,比如
34
34
34
484
484
484
如果直接模拟输出的是
44483
44483
44483,实际上最大的是
48443
48443
48443,问题就在如果两端数相等的时候,得判断下一个数决定输出。
下面是当时模拟出错的代码。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string s1,s2;
int T,cases=0;
int tran(char ch){
return ch-'0';
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>T;
while(T--){
cin>>s1>>s2;
int len1=s1.length();
int len2=s2.length();
int l1,r1,l2,r2;
string ss="";
l1=0;
l2=0;
r1=len1-1;
r2=len2-1;
cases++;
int cnt=0;
while(l1<=r1||l2<=r2){
int max1=0,max2=0,maxx=0;
int a1=tran(s1[l1]);
int a2=tran(s1[r1]);
int b1=tran(s2[l2]);
int b2=tran(s2[r2]);
if(l1<=r1){
max1=max(a1,a2);
}
if(l2<=r2){
max2=max(b1,b2);
}
//compare max1 and max2
maxx=max(max1,max2);
if(maxx==a1){l1++;}
else if(maxx==a2){r1--;}
else if(maxx==b1){l2++;}
else{r2--;}
//cout<<a1<<" "<<a2<<" "<<b1<<" "<<b2<<" "<<maxx<<endl;
ss+=(maxx+'0');
}
cout<<ss<<endl;
}
return 0;
}
看了别人的代码,发现如果用一个字符串直接判断大小,很巧妙。
可以看一下string里卖弄erase的用法。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int T,cases=0;
string s1,s2;
int main(){
std::ios::sync_with_stdio(false);
cin>>T;
while(T--){
cases++;
cout<<"Case #"<<cases<<": ";
string s="";
cin>>s1>>s2;
string s3=s1;
string s4=s2;
reverse(s3.begin(),s3.end());
reverse(s4.begin(),s4.end());
int cnt=0;
int len1=s1.length();
int len2=s2.length();
while(cnt<len1+len2){
string Max="";
int f=0;
if(s1>Max) {Max=s1;f=1;}
if(s2>Max) {Max=s2;f=2;}
if(s3>Max) {Max=s3;f=3;}
if(s4>Max) {Max=s4;f=4;}
if(f==1){
cout<<s1[0];
s1.erase(0,1);
s3.erase(s3.length()-1,1);
}
else if(f==2){
cout<<s2[0];
s2.erase(0,1);
s4.erase(s4.length()-1,1);
}
else if(f==3){
cout<<s3[0];
s3.erase(0,1);
s1.erase(s1.length()-1,1);
}
else{
cout<<s4[0];
s4.erase(0,1);
s2.erase(s2.length()-1,1);
}
cnt++;
}
cout<<endl;
}
return 0;
}