#include<bits/stdc++.h>
using namespace std;
string choice[200];
int main(){
    int number,ex;
    cin>>number;
    bool Maxb,Minb,None;
    for(int i=1;i<=number;i++){
        None=true;
        //循环n题
        //选项写入数组
        cin>>choice[1]>>choice[2]>>choice[3]>>choice[4];
        //遍历4选项
        for(int j=1;j<=4;j++){
            Maxb=true;
            Minb=true;
            //遍历对比其他
            for(int k=1;k<=4;k++){
                //不对比自己
                if(j==k){
                    continue;
                }
                if(choice[j].size()<=choice[k].size()){
                    Maxb=false;//有更大或等于不是max
                }
                if(choice[j].size()>=choice[k].size()){
                    Minb=false;
                }
            }
            //遍历对比完毕
            if(Maxb==true){
                ex=j;
                None=false;
            }else if(Minb==true){
                ex=j;
                None=false;
            }
        }
        if(None==true||Maxb==Minb){
            cout<<"C"<<endl;
        }else{
            cout<<choice[ex][0]<<endl;
        }
    }
    return 0;
}

原始思路:遍历每一个选项,再用此选项遍历其他选项(跳过自己),max和min默认为true,如果遇到相等或更大/小就变成false。每个选项对比后,如果max/min仍为true,则将此选项存为ex。遍历完所有选项后,同时有max和min不符合条件,输出C。无则输出ex。

问题:最后C的max和min总是D选项的值,因为遍历时会将max/min重设为true。这导致很可能错误地输出C。

改进:最后不在判断max==min,而是把max存入maxone,min存入minone。如果maxone和minone都非空则输出C.

#include<bits/stdc++.h>
using namespace std;
string choice[200];
int main(){
    int number,maxone,minone;
    cin>>number;
    bool Maxb,Minb,None;
    for(int i=1;i<=number;i++){
        None=true;
        //循环n题
        //选项写入数组
        cin>>choice[1]>>choice[2]>>choice[3]>>choice[4];
        //遍历4选项
        maxone=0;
        minone=0;
        for(int j=1;j<=4;j++){
            Maxb=true;
            Minb=true;
            //遍历对比其他
            for(int k=1;k<=4;k++){
                //不对比自己
                if(j==k){
                    continue;
                }
                if(choice[j].size()<=choice[k].size()){
                    Maxb=false;//有更大或等于不是max
                }
                if(choice[j].size()>=choice[k].size()){
                    Minb=false;
                }
            }
            //遍历对比完毕
            if(Maxb==true){
                maxone=j;
                None=false;
            }else if(Minb==true){
                minone=j;
                None=false;
            }
        }
        if(None==true||(maxone!=0&&minone!=0)){
            cout<<"C"<<endl;
        }else if(maxone!=0){
            cout<<choice[maxone][0]<<endl;
        }else{
            cout<<choice[minone][0]<<endl;
        }
    }
    return 0;
}

逻辑没有问题。但是我忽略了规则。我以为输入的选项总会以ABCD开头,但这不在规定里。通过了10/12。我马上修改。

#include<bits/stdc++.h>
using namespace std;
string choice[200];
char Index[10]={' ','A','B','C','D'};
int main(){
    int number,maxone,minone;
    cin>>number;
    bool Maxb,Minb,None;
    for(int i=1;i<=number;i++){
        None=true;
        //循环n题
        //选项写入数组
        cin>>choice[1]>>choice[2]>>choice[3]>>choice[4];
        //遍历4选项
        maxone=0;
        minone=0;
        for(int j=1;j<=4;j++){
            Maxb=true;
            Minb=true;
            //遍历对比其他
            for(int k=1;k<=4;k++){
                //不对比自己
                if(j==k){
                    continue;
                }
                if(choice[j].size()<=choice[k].size()){
                    Maxb=false;//有更大或等于不是max
                }
                if(choice[j].size()>=choice[k].size()){
                    Minb=false;
                }
            }
            //遍历对比完毕
            if(Maxb==true){
                maxone=j;
                None=false;
            }else if(Minb==true){
                minone=j;
                None=false;
            }
        }
        if(None==true||(maxone!=0&&minone!=0)){
            cout<<"C"<<endl;
        }else if(maxone!=0){
            cout<<Index[maxone]<<endl;
        }else{
            cout<<Index[minone]<<endl;
        }
    }
    return 0;
}

通过。None是不是有点多余?我懒得改了。