题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1872
思路:模拟题,用上结构体,按题意做题,要有耐心。代码如下:
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct inp{
char name[100];
int grade;
int grate;
}a[1000],b[1000];
bool cmp(inp a,inp b){
if(a.grade!=b.grade)
return a.grade>b.grade;
else
return a.grate<b.grate;
}
int main(){
int n;
int k0,k1;
while(cin>>n){
k0=1;k1=1; //引入k0,k1这两个神奇的变量
for(int i=0;i<n;i++){
cin>>a[i].name>>a[i].grade;
a[i].grate=i;
}
sort(a,a+n,cmp);
for(int j=0;j<n;j++)
cin>>b[j].name>>b[j].grade;
for(int i=0;i<n;i++){
if(strcmp(a[i].name,b[i].name)!=0){
k0=0;
break;
}
}
for(int i=0;i<n;i++){
if(a[i].grade!=b[i].grade){
k1=0;
break;
}
}
if(k0==0&&k1==1){ //对应算法正确但不稳定
cout<<"Not Stable"<<endl;
for(int i=0;i<n;i++){
cout<<a[i].name<<" ";
cout<<a[i].grade<<endl;
}
}
else if(k1==0){ //直接由k1即可判断算法错误这种情况
cout<<"Error"<<endl;
for(int i=0;i<n;i++){
cout<<a[i].name<<" ";
cout<<a[i].grade<<endl;
}
}
else if(k0==1&&k1==1) //k0,k1的该组值可得算法正确
cout<<"Right"<<endl;
}
return 0;
}
ps:可以笨,但是得勤快
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7609 Accepted Submission(s): 2808 Problem Description 大家都知道,快速排序是不稳定的排序方法。
Input 本题目包含多组输入,请处理到文件结束。
Output 对于每组数据,如果算法是正确并且稳定的,就在一行里面输出"Right"。如果算法是正确的但不是稳定的,就在一行里面输出"Not Stable",并且在下面输出正确稳定排序的列表,格式同输入。如果该算法是错误的,就在一行里面输出"Error",并且在下面输出正确稳定排序的列表,格式同输入。
Sample Input 3 aa 10 bb 10 cc 20 cc 20 bb 10 aa 10 3 aa 10 bb 10 cc 20 cc 20 aa 10 bb 10 3 aa 10 bb 10 cc 20 aa 10 bb 10 cc 20
Sample Output Not Stable cc 20 aa 10 bb 10 Right Error cc 20 aa 10 bb 10 |