排序题 PAT 1012 The Best Rank (25 分) ***

排序题

带***的为参考算法笔记的解法,非完全自己构思。

心得:
不要害怕sort改变了数组顺序
可以用自己的rank数组记录结果。

error: reference to ‘rank’ is ambiguous
错误是函数重复了,修改了首字母变成大写。

利用数组来记录优先级,便于输出

因为只要排名,平均分可以直接用总分代替

#include <cstdio>
#include <algorithm>
using namespace std;

typedef struct Node
{
	int ID;
	int grade[4];
}student;

int now= -1;
char s[4]={'A','C','M','E'};
int Rank[1000000][4] = {0};

bool cmp(student a,student b)
{
	return a.grade[now] > b.grade[now];
}

int main(int argc, char** argv) {
	
	int n,m;
	int check[10000];

	
	scanf("%d %d",&n,&m);
	student stu[n];	
	
	for(int i =0;i<n;i++)
	{
		scanf("%d %d %d %d",&stu[i].ID,&stu[i].grade[1],&stu[i].grade[2],&stu[i].grade[3]);
		stu[i].grade[0] = stu[i].grade[1] + stu[i].grade[2] + stu[i].grade[3];
	}
	
	for(now = 0;now<4;now++)
	{
		sort(stu,stu+n,cmp);
		Rank[stu[0].ID][now] = 1;
		for(int i =1;i<n;i++)
		{
			if(stu[i].grade[now] == stu[i-1].grade[now])
				Rank[stu[i].ID][now] = Rank[stu[i-1].ID][now];
			else
				Rank[stu[i].ID][now] = i + 1;
		}
	} 
	
	for(int i =0;i<m;i++)
	{
		scanf("%d",&check[i]);
		
	}
	for(int i =0;i<m;i++)
	{
		
		int temp = 9999;
		int index = -1;
		for(int j = 0;j<4;j++)
		{
			if(Rank[check[i]][j] == 0)
				break;
			if(temp > Rank[check[i]][j])
			{
				
				temp = Rank[check[i]][j];
				index = j;
			}
//			else if(temp == Rank[check[i]][j])
			
		}
		if(temp!=9999)
			printf("%d %c\n",temp,s[index]);
		else
			printf("N/A\n");		
	}
	
	
	
	
	
	return 0;
}
在这里插入代码片

猜你喜欢

转载自blog.csdn.net/qq_15556537/article/details/88694000