B. MUH and Important Things
题意:n个数,h1~hn,他们之中可能有相同的。给这n个数排序,问是否有大于三种排法(相同的数可以交换)。如果有,输出其中三中。
思路:找这些数中有没有一样的。如果有两组一样的,就可以,交换输出一下就行了。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include <ctype.h>
using namespace std;
int n;
int num[2010];
int rank[2010];
bool cmp(int a,int b){
return num[a]<num[b];
}
int main(){
while(cin>>n){
for(int i=1;i<=n;i++){
cin>>num[i];
}
for(int i=0;i<=n;i++)rank[i]=i;
sort(rank+1,rank+n+1,cmp);
int cnt=0;
int k1;
int k2;
for(int i=2;i<=n;i++){
if(num[rank[i]]==num[rank[i-1]])cnt++;
if(cnt==1)k1=i;
if(cnt==2)k2=i;
}
if(cnt>1){
cout<<"YES"<<endl;
for(int i=1;i<=n;i++){
cout<<rank[i]<<" ";
}
cout<<endl;
int t=0;
for(int i=1;i<=n;i++){
if(num[rank[i]]==num[rank[i+1]]){
if(t==0){
cout<<rank[i+1]<<" "<<rank[i]<<" ";
i++;t++; continue;
}else{
}
}
cout<<rank[i]<<" ";
}
cout<<endl;
t=0;
for(int i=1;i<=n;i++){
if(num[rank[i]]==num[rank[i+1]]){
if(t==0){
t++;
}else if(t==1){
cout<<rank[i+1]<<" "<<rank[i]<<" ";
i++;t++; continue;
}
}
cout<<rank[i]<<" ";
}
cout<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}