1025 PAT Ranking
阿新 • • 發佈:2018-12-21
題目大意:
給幾張榜,最後輸出的總排名榜每行的輸出格式為:賬號 總排名 原來的榜單號 原榜排名。如果分數相同就按照賬號從小到大排序,注意樣例的排名如果出現並列排名就不是連續的了,比如1 1 3 4 5這樣的排名是正確的,1 1 2 3 4 就是錯誤的。
解題思路:
結構體分段排序,每輸入一組就對這一組進行一次排序,得出該組每人在本組中的排名,最後對所有人進行一次總排名即可。 程式碼如下:
#include<iostream> #include<cstdio> #include<fstream> #include<set> #include<cmath> #include<cstring> #include<string> #include<map> #include<vector> #include<iomanip> #include<cstdlib> #include<list> #include<queue> #include<stack> #include<algorithm> #define inf 0x3f3f3f3f #define MOD 1000000007 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define meminf(a) memset(a,inf,sizeof(a)) //vector ::iterator it; //set<int>::iterator iter; typedef long long ll; typedef unsigned long long ull; using namespace std; struct pat { string num; int score,rank1,rank2,location; }p[30010]; int cmp(pat a,pat b) { if(a.score!=b.score) return a.score>b.score; else return a.num<b.num; } int main() { // std::ios::sync_with_stdio(false); // cin.tie(0); // freopen("test.txt","r",stdin); // freopen("output.txt","w",stdout); int n,j=1,t=0,k=0;//t為區間的左端點,k為右端點 cin>>n; while(n--) { int m; cin>>m; k=t+m;//在總體中的上限 for(int i=t;i<k;i++) { cin>>p[i].num>>p[i].score; p[i].location=j; } sort(p+t,p+k,cmp); p[t].rank2=1; for(int i=t+1;i<k;i++)//每組榜單中每人的名次 { if(p[i].score==p[i-1].score)p[i].rank2=p[i-1].rank2; else p[i].rank2=i+1-t; } t=k; j++; } sort(p,p+k,cmp);//總排名 p[0].rank1=1; for(int i=1;i<k;i++)//總榜中每人的名次 { if(p[i].score==p[i-1].score)p[i].rank1=p[i-1].rank1; else p[i].rank1=i+1; } cout<<k<<endl; for(int i=0;i<k;i++) { cout<<p[i].num<<' '<<p[i].rank1<<' '<<p[i].location<<' '<<p[i].rank2<<endl; } return 0; }