您的位置:首页 > 其它

九度oj 题目1014:排名

2017-03-03 21:00 267 查看
题目1014:排名

时间限制:1秒

内存限制:32兆

特殊判题:

提交:9361

解决:2820

题目描述:
今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的成绩按降序打印。
输入:
测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N(0<N<1000)、考题数M(0<M<=10)、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。

输出:
对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考号的升序输出。

样例输入:
4525
1010121315
CS0043513
CS003524135
CS002212
CS0013235
1240
1030
CS00112
2320
101010
CS0000000000000000010
CS000000000000000002212
0

样例输出:
3
CS00360
CS00137
CS00437
0
1
CS00000000000000000220
分析:主要进行输入数据的处理。用到c_str()函数。

语法: constchar*c_str(); c_str()函数返回一个指向正规C字符串的指针常量,内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成c中的字符串样式。 注意:一定要使用strcpy()函数等来操作方法c_str()返回的指针 比如:最好不要这样: char*c; strings="1234"; c=s.c_str();//c最后指向的内容是垃圾,因为s对象被析构,其内容被处理,同时,编译器也将报错——将一个constchar*赋与一个char*。 应该这样用: charc[20]; strings="1234"; strcpy(c,s.c_str()); 这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作 再举个例子 c_str()以char*形式传回string内含字符串 如果一个函数要求char*参数,可以使用c_str()方法: strings="HelloWorld!"; printf("%s",s.c_str());//输出"HelloWorld!"

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
usingnamespacestd;

typedefstruct{
stringid;
intscore;
}candidate;

boolcmp(candidatea,candidateb){
if(a.score!=b.score)
returna.score>b.score;
else
returna.id<b.id;
}

intmain(){
//N表示人数,M表示考题数,G分数线
intN,M,G,m,num,sum;
inti,j;
stringstr;
ints[10];
charid[21];
candidatestu;
vector<candidate>v;
while(scanf("%d%d%d",&N,&M,&G)){
if(N==0)
break;
v.clear();
intreach=0;
for(i=0;i<M;i++)
scanf("%d",&s[i]);//每题分数
for(i=0;i<N;i++){
scanf("%s%d",id,&m);
str=id;
sum=0;
for(j=0;j<m;j++){
scanf("%d",&num);
sum+=s[num-1];
}
if(sum>=G){
reach++;
v.push_back(stu);
v[reach-1].id=str;
v[reach-1].score=sum;
}
}
sort(v.begin(),v.end(),cmp);
printf("%d\n",reach);
for(i=0;i<v.size();i++){
printf("%s%d\n",v[i].id.c_str(),v[i].score);//c_str()函数
//cout<<v[i].id<<""<<v[i].score<<endl;
}
}
return0;
}


#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
usingnamespacestd;

typedefstruct{
stringid;
intscore;
}candidate;

boolcmp(candidatea,candidateb){
if(a.score!=b.score)
returna.score>b.score;
else
returna.id<b.id;
}

intmain(){
//N表示人数,M表示考题数,G分数线
intN,M,G,m,num,sum;
inti,j;
stringstr;
ints[10];
candidatestu;
vector<candidate>v;
while(cin>>N>>M>>G){
if(N==0)
break;
v.clear();
intreach=0;
for(i=0;i<M;i++)
cin>>s[i];//每题分数
for(i=0;i<N;i++){
cin>>str>>m;
sum=0;
for(j=0;j<m;j++){
cin>>num;
sum+=s[num-1];
}
if(sum>=G){
reach++;
v.push_back(stu);//这里一定要注意,先在容器中创造一个结构体空间,然后在赋值
v[reach-1].id=str;
v[reach-1].score=sum;
}
}
sort(v.begin(),v.end(),cmp);
cout<<reach<<endl;
for(i=0;i<v.size();i++){
cout<<v[i].id<<""<<v[i].score<<endl;
}
}
return0;
}


总结:需要注意的是,vector容器是结构体类型的话,push_back()元素的方法


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: