A1141 PAT Ranking of Institutions
阿新 • • 發佈:2018-12-02
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;
}