Input
輸入包括多組數據,每組數據的第壹行是壹個整數n(n<50000),表示有多少個學生;接下來n + 1行,第壹行輸入為三個實數(介於0到1之間),分別代表三科成績依次在綜合測評中所占的權重;之後輸入的n行中每行代表壹個學生,每行依次為姓名(註:姓名只含有字母和下劃線,不超過25個字符),語文,數學,英語三門課的成績(註:成績為實數,介於0到100之間),綜合測評成績為所有科目分數和加權和。
Output
對於每組數據,綜合測評成績排名從高到低輸出所有學生(成績相同按姓名字典序排列),每個學生壹行,每行依次為姓名,語文,數學,英語三門課成績,綜合測評得分,具體見樣例。
Sample Input
1 0.5 0.5 0.5 zhangsan 100 100 100 3 0.2 0.3 0.6 zhangsan 100 20 50 lisi 55 66 77 wangwu 22 33 66
Sample Output
zhangsan 100.0 100.0 100.0 150.0 lisi 55.0 66.0 77.0 77.0 zhangsan 100.0 20.0 50.0 56.0 wangwu 22.0 33.0 66.0 53.9
HINT
考察知識點:小數據量的排序問題,時間復雜度O(nlog)),空間復雜度O(n)
禁用庫函數排序
Append Code
#include"iostream"
#include"cstring"
#include"cstdio"
using namespace std;
typedef struct
{
string name;
double chinese,math,english,sum;
} student;
void Qst(student *s,int low,int high)
{
int x=low;
int y=high;
student st=s[low];
if(low >= high)
{
return;
}
while(x
{
while(x=st.sum)
{
if(s[y].sum== st.sum&&s[y].name>= st.name)
break;
--y;
}
s[x]=s[y];
while(x < y && s[x].sum<=st.sum)
{
if(s[x].sum== st.sum&&s[x].name<= st.name)
break;
++x;
}
s[y]=s[x];
}
s[x]=st;
Qst(s,low,x-1);
Qst(s,x+1,high);
}
int main()
{
int n,i;
string name;
double a,b,c;
while(cin>>n>>a>>b>>c)
{
student s[n];
for(i=0; i
{
cin>>s[i].name>>s[i].chinese>>s[i].math>>s[i].english;
s[i].sum=0;
s[i].sum+=s[i].chinese*a;
s[i].sum+=s[i].math*b;
s[i].sum+=s[i].english*c;
}
Qst(s,0,n-1);
for(i=n-1; i>=0; i--)
{
cout<<s[i].name<<" ";
printf("%.1lf %.1lf %.1lf %.1lf\n",s[i].chinese,s[i].math,s[i].english,s[i].sum);
}
}
}