稳定排序,一个简单的题目,老是WA,不知为什么

zhzhl202 2010-03-13 07:35:30
http://acm.hdu.edu.cn/showproblem.php?pid=1872
大家都知道,快速排序是不稳定的排序方法。
如果对于数组中出现的任意a[i],a[j](i<j),其中a[i]==a[j],在进行排序以后a[i]一定出现在a[j]之前,则认为该排序是稳定的。

某高校招生办得到一份成绩列表,上面记录了考生名字和考生成绩。并且对其使用了某排序算法按成绩进行递减排序。现在请你判断一下该排序算法是否正确,如果正确的话,则判断该排序算法是否为稳定的。



Input
本题目包含多组输入,请处理到文件结束。
对于每组数据,第一行有一个正整数N(0<N<300),代表成绩列表中的考生数目。
接下来有N行,每一行有一个字符串代表考生名字(长度不超过50,仅包含'a'~'z'),和一个整数代表考生分数(小于500)。其中名字和成绩用一个空格隔开。
再接下来又有N行,是上述列表经过某排序算法以后生成的一个序列。格式同上。


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
我的代码如下:
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;

struct stu
{
string name;
int sc;

};

vector<stu> v;
bool cmp(stu a,stu b)
{

return a.sc>b.sc;
}

int main()
{
int n,i,flag;
string str;int s;
while(scanf("%d",&n)!=EOF)
{
v.clear();
v.resize(n);

//memset(v,)
for(i=0;i<n;i++)
{
cin>>v[i].name>>v[i].sc;
}
stable_sort(v.begin(),v.end(),cmp);//先排序,在和它的对比
flag=0;
for(i=0;i<n;i++)
{
cin>>str>>s;
if(flag!=0)
continue;

if(s!=v[i].sc)
flag=1;//不对应,说明其算法错误
else
if(str!=v[i].name)//分数对应,但名字不对应,说明不稳定
flag=2;

}
if(flag==0)
cout<<"Right"<<endl;
else
{
if(flag==1)
cout<<"Error"<<endl;
if(flag==2)
cout<<"Not Stable"<<endl;
for(i=0;i<n;i++)
cout<<v[i].name<<' '<<v[i].sc<<endl;

}

}
return 0;
}
...全文
90 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhzhl202 2010-03-13
  • 打赏
  • 举报
回复
真乃神人也!!!敬佩敬佩!!!
baihacker 2010-03-13
  • 打赏
  • 举报
回复
 for(i=0;i<n;i++)
{
cin>>str>>s;
if (flag == 2 && s!=v[i].sc) flag = 1;
if(flag!=0)
continue;
//这样就能过了。
//因为在前面检测到不稳定,但是在后面发生错误这种情况你没有处理。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧