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

0
0
已解决
李显晨
李显晨
中级启示者
中级启示者

错误代码WA10分

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<iomanip>
#include<algorithm>
#pragma GCC optimize(3)
using namespace std;
char a[10000050];
int main(){
    string s="";
    int n,i,j;
    cin>>n;
    for(int k=1;k<=n;k++) cin>>a[k];
    i=1,j=n;
    while(i<=j){
        if(a[i]<a[j]){
            s+=a[i];
            i++;
        }
        else if(a[i]>=a[j]){
            s+=a[j];
            j--;
        }
    }
    cout<<s;
    return 0;
}

传送门

求大佬找错

李显晨在2021-03-09 17:49:40追加了内容

ding

李显晨在2021-03-09 18:54:15追加了内容
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<iomanip>
#include<algorithm>
#pragma GCC optimize(3)
using namespace std;
char a[10000050];
int cnt;
bool f(int i,int j){
    if(a[i]>a[j]) return 1;
    if(a[i]<a[j]) return 0;
    while(a[i]==a[j]&&i<=j){
        i++,j--;
    }
    if(a[i]>a[j]) return 1;
    else return 0;
}
int main(){
    int n,i,j;
    cin>>n;
    i=1,j=n;
    while(i<=j){
        if(f(i,j)){
            cout<<a[j];
            j--;
            cnt++;
        }
        else{
            cout<<a[i];
            i++;
            cnt++;
        }
        if(cnt%80==0) cout<<endl;
    }
    return 0;
}

哪错了?@汪凯恒


0
已采纳
汪恺恒
汪恺恒
中级启示者
中级启示者

我们昨天的打卡题……

你的错误原因:如果a[i]不小于a[j],选a[j]不一定是最优解

核心部分,判断函数(选那一边的字符是最优解)

bool f(int i,int j){  
    if(s[i]>s[j]) return true;  //如果s[i]字典序大,就选s[j]
    if(s[i]<s[j]) return false;
    while(s[i]==s[j]&&i<=j){
        i++;
        j--;
    }
    if(s[i]>s[j]) return true;
    else return false;
}

之后再定义两个下标i和j,用while循环求解(注意,题目说每行最多输出80个字符。

建议采用边循环边输出的方法

像这样

if( ){
            cout<<s[j];
            j--;
        }else{
            cout<<s[i];
            i++;
        }

每次输出cnt++,如果cnt%80==0,则输出endl

0
我要回答