社区讨论

30pts求调!

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lwf201u4
此快照首次捕获于
2024/05/20 22:20
2 年前
此快照最后确认于
2024/05/21 14:15
2 年前
查看原帖
小学生写的烂代码,不喜勿喷,如果看不懂写得什么可以看注释
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,v=1;//v记录目前并列的名次
struct pm{
	ll c,m,e,cm,maxcm,zf;
}a[100005],b[100005]; 
bool cmp(pm x,pm y){
	if(x.zf!=y.zf)return x.zf>y.zf;
	else if(x.cm!=y.cm)return x.cm>y.cm;
	else if(x.maxcm!=y.maxcm)return x.maxcm>y.maxcm;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].c>>a[i].m>>a[i].e;
		b[i].c=a[i].c,b[i].m=a[i].m,b[i].e=a[i].e;//把a数组拷贝到b数组中
		a[i].cm=a[i].c+a[i].m;//算语文和数学的总和
		a[i].maxcm=max(a[i].c,a[i].m);//算语文和数学的较大值
		a[i].zf=a[i].c+a[i].m+a[i].e;//算总分	
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		ll pm,maxx,maxl,maxm;
		for(int j=1;j<=n;j++)
			if(b[i].c==a[j].c&&b[i].m==a[j].m&&b[i].e==a[j].e)
				pm=j,maxx=a[j].maxcm,maxl=a[j].zf,maxm=a[j].cm;
		/*如果从已排序序列找到了和未排序序列当前值完全一样的值,
		那么就记录它在已排序序列中的排名(pm)*/
		if(a[v].maxcm==maxx&&a[v].cm==maxm&&a[v].zf==maxl)pm=v;
		//如果目前值符合并列条件,则排名变为并列名次
		else v=pm;//否则并列名次更新为当前值的名次
		cout<<pm<<endl;
	}	
	
	return 0;
}

回复

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

正在加载回复...