#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是不是有点多余?我懒得改了。