社区讨论

过样例但是30分,已注释求debug!

B3968[GESP202403 五级] 成绩排序参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lzh62jun
此快照首次捕获于
2024/08/05 23:49
2 年前
此快照最后确认于
2024/08/06 09:27
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n;
struct node{
	int c,m,e,sum,rk,num;
}a[105];
inline bool cmp(node x,node y)
{
	if(x.sum!=y.sum) return x.sum>y.sum;
	if(x.c+x.m!=y.c+y.m) return x.c+x.m>y.c+y.m;
	if(max(x.c,x.m)!=max(y.c,y.m)) return max(x.c,x.m)>max(y.c,y.m);
}//排名排序
inline bool cmp2(node x,node y)
{
	return x.num<y.num;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		a[i].num=i;//存编号
		cin>>a[i].c>>a[i].m>>a[i].e;
		a[i].sum=a[i].c+a[i].m+a[i].e;//存总分
	}
	sort(a+1,a+1+n,cmp);//按成绩好的排序
	a[1].rk=1;//第一名的rank为1
	int num=1;//每个人的最高排名
	for(int i=2;i<=n;i++)//i是每个人的最低排名
	{
		if(a[i].sum==a[i-1].sum && a[i].c+a[i].m==a[i-1].c+a[i-1].m && max(a[i].c,a[i].m)==max(a[i-1].c,a[i-1].m))//满足名次相同的条件
			a[i].rk=num;//实际rank为最高排名
		else
		{
			num=i;//更新下一轮的最高排名
			a[i].rk=num;
		}
	}
	sort(a+1,a+1+n,cmp2);//重新按照编号排序
	for(int i=1;i<=n;i++) cout<<a[i].rk<<endl;//按顺序输出每人rank
}

回复

0 条回复,欢迎继续交流。

正在加载回复...