7-104 学生成绩排序 (15分)

假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型。输入n(n<50)个学生的成绩信息,按照学生的个人平均分从高到低输出他们的信息。如果平均分相同,按输入的先后顺序排列。
输入格式:
输入一个正整数n(n<50),下面n行输入n个学生的信息,包括:学号、姓名、三门课程成绩(整数)。
输出格式:
输出从高到低排序后的学生信息,包括:学号、姓名、平均分(保留两位小数)。
输入样例:
3
101 Zhang 78 87 85
102 Wang 91 88 90
103 Li 75 90 84

输出样例:
102,Wang,89.67
101,Zhang,83.33
103,Li,83.00

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  
#define fi first
#define se second
#define pb push_back
#define SZ(x) ((ll)x.size())
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define REP(i,n) for(int i=0;i<(n);++i)
#define mem(a,b) memset(a,(b),sizeof(a));
const int maxn = 100;
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
typedef pair<ll,ll> pii;
template<class T>
inline void read(T &x){
 x=0;
 int f=0;
 char c=getchar();
 while(!isdigit(c)){
  f|=(c=='-');
  c=getchar();
 }
 while(isdigit(c)){
  x=(x<<3)+(x<<1)+c-'0';
  c=getchar();
 }
 if(f) x=-x;
}
ll ksm(ll a,ll b,ll mod){
 ll ans=1;
 while(b){
  if(b&1) ans=ans*a%mod;
  a=a*a%mod;
  b>>=1;
 }
 return ans;
}
int gcd(int a,int b){
 return b==0?a:gcd(b,a%b);
}
struct node{
 int id;
 string t;
 double ave;
 int sx;
 bool operator < (const node &y) const{
  return ave==y.ave?sx<y.sx:ave>y.ave;
 }
}s[maxn];
int n;
int main(){
 scanf("%d",&n);
 for(int i=0;i<n;i++){
  int a,b,c,sum=0;
  cin>>s[i].id >> s[i].t>>a>>b>>c;
  sum=a+b+c;
  s[i].ave=1.0*sum/3;
  s[i].sx=i;
 }
 sort(s,s+n);
 for(int i=0;i<n;i++){
  printf("%d,%s,%.2lf\n",s[i].id,s[i].t.c_str(),s[i].ave);
 }
 return 0;
}

你可能感兴趣的:(算法)