2165 绩点神马的最讨厌了

北航有一套恐怖的绩点机制。当然其他学校也有,只不过没有北航那么恐怖而已。

绩点决定了我们的前途,所以一个好的绩点算法就尤为重要了。对于必修课程所占的平均绩点,北航是这么计算的:

某科绩点=该科的成绩所对应的绩点*该科学分

总平均绩点=总绩点数/学分总数

其中,90分及以上绩点为1.5,80分及以上绩点为1.3,70分及以上绩点为1.1,60分及以上绩点为1.0,60分以下绩点为0。

如,A同学十分努力,数学分析这门课得到了90分,而离散数学只得到了70分;数学分析的学分是7,离散数学的学分是3.则他的平均绩点为:(1.5*7+1.1*3)/10=1.38

现在告诉你某些系的成绩单和学分数,请你帮忙算出这些系的同学在系中的平均绩点排名(当然从高到低)。如果平均绩点相同那么就按照学号从小到大排序。

输入

第一行为一个数字M,表示的系的个数。M<50。

之后为M组数据。对于每一组数据,第一行首先为两个整数N和P,N<=1000,P<=20,表示该系的学生数和学科数;接下来有P个浮点数,表示该P个学科依次的学分数。接下来N行,每行有P+1个整数,第一个数为该同学学号(8位数字,没有前导0),接下来为P个学科依次的分数。

输出

对于每组数据,输出按平均绩点从大到小的排名,只需输出学号。

每两组数据间用一个空行分隔。

样例输入
1
2 2 7 3
10060000 90 70
99999999 65 85
 
     

样例输出


10060000
99999999



简单的模拟题,冒泡排序即可

#include <stdio.h>
#include <string.h>


int main()
{
	int number,t;
	int i,j;
	float bb[21];
	int n,p;
	int temp;
	float a[1001];
	float tempa;
	char b[1001][10];
	char tempb[10];

	scanf("%d",&number);
	
	for(t=1;t<=number;t++)
	{
		scanf("%d %d",&n,&p);
		for(i=0;i<p;i++)
			scanf("%f",&bb[i]);

		for(i=0;i<n;i++)
		{
			a[i]=0;
			scanf("%s",&b[i]);

			for(j=0;j<p;j++)
			{
				scanf("%d",&temp);

				if(temp>=90)
				{
					a[i]+=1.5*bb[j];

				}
				else if(temp>=80)
				{
					a[i]+=1.3*bb[j];
				}
				else if(temp>=70)
				{
					a[i]+=1.1*bb[j];
				}
				else if(temp>=60)
				{
					a[i]+=1.0*bb[j];
				}
				else
				{
					a[i]+=0;
				}
			}

		}

		for(i=0;i<n;i++)
			for(j=i+1;j<n;j++)
			{
				if(a[i]<a[j])
				{
					strcpy(tempb,b[j]);
					strcpy(b[j],b[i]);
					strcpy(b[i],tempb);

					tempa=a[i];
					a[i]=a[j];
					a[j]=tempa;
				}

			}

			for(i=0;i<n;i++)
			{
				printf("%s\n",b[i]);
			}


	}
	return 0;
	
}


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