牛客网一道成绩排序题,不知道哪里的问题,一直过不去

小卜妞~ 2019-03-07 10:41:55
题目链接:https://www.nowcoder.com/practice/0383714a1bb749499050d2e0610418b1?tpId=40&tqId=21333&tPage=1&rp=5&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking
/*
成绩查找+排序
cin:人数+排序方式+姓名+成绩
cout:姓名+成绩
分数相同,按照输入顺序排列
*/
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

struct Stu{
char name[10];
int score;
};

bool cmp(Stu a,Stu b){
return a.score > b.score;
}

bool cmp1(Stu a,Stu b){
return a.score < b.score;
}
int main(){
int n,type;
while(cin>>n>>type){
vector<Stu> v(n);
v.clear();
for(int i=0;i<n;i++){
cin>>v[i].name>>v[i].score;
}

if(type == 0){
sort(v.begin(),v.begin()+n,cmp);
}else if(type == 1){
sort(v.begin(),v.begin()+n,cmp1);
}

for(int i=0;i<n;i++){
cout<<v[i].name<<" "<<v[i].score<<endl;
}
}
return 0;
}

...全文
268 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
画自 2019-08-03
  • 打赏
  • 举报
回复
不能用sort,排序不稳定,用stable_sort即可
qq_42307333 2019-03-07
  • 打赏
  • 举报
回复
引用 6 楼 穷达已经存在的回复:
[quote=引用 3 楼 qq_42307333 的回复:] a[10]是第11个元素,你这个容器有多少个元素?
我的意思是定义一个长度为10 的int数组,不是a[10]这个元素。[/quote] 不好意思,这个函数好久没用过了,我以为就是起始地址,哪知道要下一位
小卜妞~ 2019-03-07
  • 打赏
  • 举报
回复
引用 3 楼 qq_42307333 的回复:
a[10]是第11个元素,你这个容器有多少个元素?
我的意思是定义一个长度为10 的int数组,不是a[10]这个元素。
yshuise 2019-03-07
  • 打赏
  • 举报
回复
bool cmp(Stu a,Stu b){
return a.score > b.score;
}

=========================
改为引用效率更高
qq_42307333 2019-03-07
  • 打赏
  • 举报
回复
那大概就是你的排序问题了吧,你看看是不是升降序反了
qq_42307333 2019-03-07
  • 打赏
  • 举报
回复
a[10]是第11个元素,你这个容器有多少个元素?
小卜妞~ 2019-03-07
  • 打赏
  • 举报
回复
引用 1 楼 qq_42307333 的回复:
为什么用begin()+n,用end()不好吗,多了一个吧
我试了 用end()也不能通过,而且begin()+n应该是对的吧。 数组a[10]排序的时候,不就是sort(a,a+10)嘛
qq_42307333 2019-03-07
  • 打赏
  • 举报
回复
为什么用begin()+n,用end()不好吗,多了一个吧
小卜妞~ 2019-03-07
  • 打赏
  • 举报
回复
引用 9 楼 WNs_ACE 的回复:
我记得 vector<Stu> v(n);这一行的代码,等于先往vector塞n个Stu对象(都是调用默认构造函数出来的对象),等于说调用完这一行代码v.size()就等于n,而这个vector就已经有n个Stu对象,然后你再往vector加入n个用户输入的数据,建议把 vector<Stu> v(n);改成 vector<Stu> v; v.reserve(n);试试看
这个好像不用改,改了之后会出现数组越界的错误。现在有一个案例说我的输出少最后一个值
链接:https://www.nowcoder.com/questionTerminal/0383714a1bb749499050d2e0610418b1
来源:牛客网

用例:
28
1
qhsq 15
ozslg 79
ncttmtsphb 71
a 39
eeiuyzsj 34
nmlrokx 21
pjizylo 90
ec 45
f 12
sh 31
fm 25
ptprphubqk 29
wxdiwv 0
uhlcpjtxad 60
w 20
zwktbpun 70
efzfkf 69
v 31
rsnrgtl 73
lhdo 76
wt 56
mcdwd 14
ydrnoyd 37
gmlfds 76
zx 1
dqx 98
gz 90
kvbzrwrrjj 13

对应输出应该为:

wxdiwv 0
zx 1
f 12
kvbzrwrrjj 13
mcdwd 14
qhsq 15
w 20
nmlrokx 21
fm 25
ptprphubqk 29
sh 31
v 31
eeiuyzsj 34
ydrnoyd 37
a 39
ec 45
wt 56
uhlcpjtxad 60
efzfkf 69
zwktbpun 70
ncttmtsphb 71
rsnrgtl 73
lhdo 76
gmlfds 76
ozslg 79
pjizylo 90
gz 90
dqx 98

你的输出为:

wxdiwv 0
zx 1
f 12
kvbzrwrrjj 13
mcdwd 14
qhsq 15
w 20
nmlrokx 21
fm 25
ptprphubqk 29
sh 31
v 31
eeiuyzsj 34
ydrnoyd 37
a 39
ec 45
wt 56
uhlcpjtxad 60
efzfkf 69
zwktbpun 70
ncttmtsphb 71
rsnrgtl 73
lhdo 76
gmlfds 76
ozslg 79
gz 90
这个是什么情况呢?我在dev中是可以出来全部的
WNs_ACE 2019-03-07
  • 打赏
  • 举报
回复
我记得 vector<Stu> v(n);这一行的代码,等于先往vector塞n个Stu对象(都是调用默认构造函数出来的对象),等于说调用完这一行代码v.size()就等于n,而这个vector就已经有n个Stu对象,然后你再往vector加入n个用户输入的数据,建议把 vector<Stu> v(n);改成 vector<Stu> v; v.reserve(n);试试看

64,281

社区成员

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

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