第一次上手PAT的甲级题目,瑟瑟发抖(英语不好对着题目愣了半天)
这一题的要点是使用sort函数。
使用sort函数必须使用
#include <algorithm>
using namespace std;
一开始我是准备在结构体内同时储存局部排名和总体排名的,但是书上的做法空间复杂度比我的好多了:
只需要在结构体内存储局部排名,在最后输出时生成具体排名,而且还解决了困扰我的名次相同的问题。
还是对sort函数不是非常熟悉,所以适应的时间长了点。
#include <cstdio> #include <algorithm> using namespace std; struct student{ char id[15];//超过int的表示范围 int location; int score; int rank; }stu[30010]; bool cmp(student a,student b){ if(a.score!=b.score)return a.score>b.score; else return strcmp(a.id,b.id)<0; } int main(){ int N,K,num=0;//考场数量,每个考场人数,考生总人数 scanf("%d",&N); for(int i=0;i<N;i++){ scanf("%d",&K); for(int j=0;j<K;j++){ scanf("%s %d",stu[num].id,&stu[num].score); stu[num].location=i; num++; } sort(stu+num-K,stu+num,cmp);//对该考场的考生排序 stu[num-K].rank=1; for(int j=num-K+1;j<num;j++){ if(stu[j].score==stu[j-1].score){ stu[j].rank=stu[j-1].rank; }else { stu[j].rank=j+1-(num-K); } } } printf("%d ",num); sort(stu,stu+num,cmp); int r=1; for(int i=0;i<num;i++){ if(i>0&&stu[i].score!=stu[i-1].score){ r=i+1; } printf("%s ",stu[i].id); printf("%d %d %d ",r,stu[i].location+1,stu[i].rank); } return 0; }