昨天做了一道简单但很麻烦的题,我只能想到结构体,并用了STL的sort方法解决了它.不过从中有许多细节问题.
题目:
Problem Description
Lcy wanted to choose 50 ACMers from m players to join HDU-ACM team.
He made n competitions , and now is your task to make the ranklist.
Here’re some instructions :
Effective score : the sum of the best n-2 competitions’ score.
One’s score in one competition : number of problems he(or she) solved divided the sum of problems all players solved.
The ranklist is made , of course , by the effective score , what if some players have the same score ?Follow these rules : girls always come first , same again and younger first , again ? In lexicographic order.
He made n competitions , and now is your task to make the ranklist.
Here’re some instructions :
Effective score : the sum of the best n-2 competitions’ score.
One’s score in one competition : number of problems he(or she) solved divided the sum of problems all players solved.
The ranklist is made , of course , by the effective score , what if some players have the same score ?Follow these rules : girls always come first , same again and younger first , again ? In lexicographic order.
Input
For each case , two integers in the first line : n (3<= n <= 10)and m(m<=1000)
The next m lines are someone’s information :
name , sex (F,M), grade and n integer numbers which means one’s number of solved problem in the ith competition.
The next m lines are someone’s information :
name , sex (F,M), grade and n integer numbers which means one’s number of solved problem in the ith competition.
Output
Output the first fifty players in order . Output all if m<50.
Sample Input
3 2 WXL F 08 3 4 5 HH M 08 3 4 5
Sample Output
WXL HH
代码如下:
Code
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
bool dic(char *a, char *b)
{
int p;
p=strcmp(a,b);
if(p>0)
return false;
else return true;
}
typedef struct
{
char name[21];
char sex;
int grade;
float score;
int s[11];
}node;
node a[1001];
bool comp(node a, node b)
{
if(a.score != b.score)
return a.score>b.score;
else
{
if(a.sex != b.sex)
return a.sex<b.sex;
else if(a.grade != b.grade)
return a.grade>b.grade;
else
return dic(a.name,b.name);
}
}
int main()
{
int n,m,i,j,k;
float b[11],p,f[11];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0; i<m; i++)
{
getchar();
scanf("%s %c %d",&a[i].name,&a[i].sex,&a[i].grade);
for(j=0; j<n; j++)
{
scanf("%d",&a[i].s[j]);
}
}
for(i=0; i<n; i++)
{
b[i]=0;
for(j=0; j<m; j++)
{
b[i]+=a[j].s[i];
}
}
for(i=0; i<m; i++)
{
a[i].score=0;
for(j=0; j<n; j++)
{
p=(float)a[i].s[j]/b[j];
f[j]=p;
}
sort(f,f+n);
for(k=n-1; k>1; k--)
{
a[i].score+=f[k];
}
}
sort(a,a+m,comp);
for(i=0; i<m; i++)
{
cout<<a[i].name<<endl;
if(i==49)break;
}
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
bool dic(char *a, char *b)
{
int p;
p=strcmp(a,b);
if(p>0)
return false;
else return true;
}
typedef struct
{
char name[21];
char sex;
int grade;
float score;
int s[11];
}node;
node a[1001];
bool comp(node a, node b)
{
if(a.score != b.score)
return a.score>b.score;
else
{
if(a.sex != b.sex)
return a.sex<b.sex;
else if(a.grade != b.grade)
return a.grade>b.grade;
else
return dic(a.name,b.name);
}
}
int main()
{
int n,m,i,j,k;
float b[11],p,f[11];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0; i<m; i++)
{
getchar();
scanf("%s %c %d",&a[i].name,&a[i].sex,&a[i].grade);
for(j=0; j<n; j++)
{
scanf("%d",&a[i].s[j]);
}
}
for(i=0; i<n; i++)
{
b[i]=0;
for(j=0; j<m; j++)
{
b[i]+=a[j].s[i];
}
}
for(i=0; i<m; i++)
{
a[i].score=0;
for(j=0; j<n; j++)
{
p=(float)a[i].s[j]/b[j];
f[j]=p;
}
sort(f,f+n);
for(k=n-1; k>1; k--)
{
a[i].score+=f[k];
}
}
sort(a,a+m,comp);
for(i=0; i<m; i++)
{
cout<<a[i].name<<endl;
if(i==49)break;
}
}
return 0;
}