1. 程式人生 > >A1141 PAT Ranking of Institutions

A1141 PAT Ranking of Institutions

1.用map做string道double的對映
2.遍歷所有對映,放進結構體陣列,然後按要求排序
3.有的題解說map會超時,我的程式沒有出現這個問題,最大執行時間到400多ms,如果真的超時用unordered_map
4.計算TWS的時候不用吧BAT都算出來在加權求和,實時加權求和一樣的
5.sort只到len長度,一開始寫了到n,結果最後一個點一直錯

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std; struct node{ string SCH; double TWS; int NS; }; bool cmp(node a,node b) { if((int)a.TWS != (int)b.TWS)return a.TWS > b.TWS; else if(a.NS != b.NS)return a.NS < b.NS; else return a.SCH < b.SCH; } int main() { int n; scanf("%d",&n); string id,sch; int grade;
map<string,node> mp; for(int i=0;i<n;i++){ cin>>id>>grade>>sch; for(int j=0;j<sch.length();j++){ //轉換為小寫 if(sch[j]>='A' && sch[j]<='Z'){ sch[j] += 'a'-'A'; } } if(id[0]=='B')mp[sch].TWS += 1.0*grade/1.5; if(id[0]=='A')mp[sch].TWS += 1.0*grade;
if(id[0]=='T')mp[sch].TWS += 1.0*grade*1.5; mp[sch].NS++; } node S[n]; //將map對映放入結構體陣列,方便排序 int len = 0; for(map<string,node>::iterator it=mp.begin();it!=mp.end();it++){ S[len] = it->second; S[len].SCH = it->first; len++; } sort(S,S+len,cmp); //排序 printf("%d\n",len); //sch個數 int rank = 1; //排名 for(int i=0;i<len;i++){ if(i>=1 && (int)S[i].TWS < (int)S[i-1].TWS)rank = i+1; printf("%d ",rank); cout<<S[i].SCH; printf(" %d %d\n",(int)S[i].TWS,S[i].NS); } return 0; }