问题标题: 酷町堂:2626 挑选字符

0
0
已解决
薛乘志
薛乘志
初级启示者
初级启示者

题目描述 Description

现在有一个长度为N的字符串,每次可以从字符串的开头或者结尾挑选一个字符,加到一个新字符串后面,新字符串初始是空串,被挑选的字符要在原串里删除。要使最终的新字符串字典序最小,求出这个字典序最小的新字符串。每行最多输出80个字符。

字典序是单词按字母顺序排列的方法。例如,“B"的字典序大于"A”;“ABD"的字典序大于"ABC”。

输入描述 Input Description

第一行,一个整数,N
接下来N行,每行一个大写字母

输出描述 Output Description

输出字典序最小的新字符串

样例输入 Sample Input

6 A C D B C B

样例输出 Sample Output

ABCBCD

数据范围及提示 Data Size & Hint

N≤10,000,000

 

我的代码:


char a[10000005]="";
long long n,i,j;
bool big(long long i,long long j){
	if(a[i]>a[j]){
		return true;
	}
	if(a[i]<a[j]){
		return false;
	}
	while(i<j&&a[i]==a[j]){
		i++;j--;
	}
	if(a[i]>a[j]){
		return true;
	}else{
		return false;
	}
}
int main(){
	cin>>n;
	for(i=1;i<=n;i++){
		cin>>a[i];
	}
	i=1;j=n;
	long long cnt=0;
	while(i<=j){
		cnt++;
		if(cnt>80){
			cout<<endl;
			cnt=0;
		}
		if(big(i,j)){
			cout<<a[j];
			j--;
		}else{
			cout<<a[i];
			i++;
		}
	}
	return 0;
}

求大佬指教

薛乘志在2021-03-08 21:19:59追加了内容

每次都是30分

薛乘志在2022-08-14 15:17:42追加了内容

薛乘志在2022-08-14 15:18:41追加了内容

薛乘志在2022-11-11 20:00:28追加了内容

薛乘志在2022-11-11 20:02:02追加了内容

111


0
已采纳
江见匀
江见匀
新手光能
新手光能

if(a[l]<a[r]) cout<<a[l++]; else if(a[l]>a[r]) cout<<a[r--]; else { int i=l+1,j=r-1; while(i<=j&&a[i]==a[j]){ i++; j--; } if(a[i]>a[j]) cout<<a[r--]; else cout<<a[l++]; } cnt++; if(cnt==80){ cnt=0; cout<<endl; }

while循环里这么写

要多考虑一点

(ps:采纳我)

江见匀在2021-03-08 21:48:29追加了内容

前面的都不需要

l=1,r=n

江见匀在2021-03-08 21:49:17追加了内容

cnt也是0

不用改cnt

0
我要回答