h075 - 成績排名
題目描述
題目要求根據學生的資訊、數學、英文成績,計算加權平均分數,並按照分數從高到低進行排名。若分數相同,則按照資訊、數學、英文的順序比較成績,若皆相同則按照座號排序。
解題思路
為了方便比較,將學生的資訊、數學、英文成績加權後,以及座號編碼成一個 long long 整數。加權平均的計算公式為 (x5+y3+z*2)。為了處理同分的情況,將資訊成績乘以 1600000000,數學成績乘以 8000000,英文成績乘以 40000,座號乘以 200,然後將這些值加總。這樣可以確保在排序時,優先比較資訊、數學、英文的成績,然後比較座號。使用 std::sort 函數對編碼後的成績進行排序,然後從高到低輸出學生的座號和平均分數。平均分數的計算方式是從編碼後的數值中提取資訊。
複雜度分析
- 時間複雜度: O(n log n)
- 空間複雜度: O(n)
程式碼
#include <iostream>
#include <algorithm>
using namespace std;
long long a[105],x,y,z,id,n;
int main(){
cin >> n;
for(int i=0;i<n;++i){
cin >> id >> x >> y >> z;
a[i] = (x*5+y*3+z*2)*1600000000+x*8000000+y*40000+z*200+(100-id);
}
sort(a,a+n);
for(int i=n-1;i>=0;--i){
int s=a[i]/1600000000;
if(s%10==0)
cout << 100-a[i]%200 << " " << s/10 << "\n";
else
cout << 100-a[i]%200 << " " << s/10 << "." << s%10 << "\n";
}
}