1 条题解

  • 0
    @ 2025-11-23 21:53:42

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e4 + 10;
    struct student {
    	int id, c, m, e, total, highest, sum;
    	/*id为输入顺序,c,m,e含义如题所述,total记录总分,
    	highest记录语文和数学的最高分,sum记录语文和数学的总分*/
    } a[maxn];
    int n, p = 1;
    //p记录用到了第几个位置
    int k;
    int ans[maxn], last;
    bool cmp(student a, student b) {//排序代码
    	if (a.total > b.total) return 1;//比较总分
    	else if (a.total < b.total) return 0;
    	else {
    		if (a.sum > b.sum) return 1;//比较语文数学分数和
    		else if (a.sum < b.sum) return 0;
    		else {
    			if (a.highest > b.highest) return 1;//比较语文数学最高分
    			else if (a.highest < b.highest) return 0;
    			else return a.id < b.id;
    		}
    	}
    }
    bool check(int num1, int num2) {//判断是否并列
    	if (a[num1].total == a[num2].total &&
    	    a[num1].sum == a[num2].sum &&
    	    a[num1].highest == a[num2].highest) return 1;
    	else return 0;
    }
    int main() {
    	cin >> n;
    	for (int i = 1; i <= n; i++) {
    		cin >> a[i].c >> a[i].m >> a[i].e;
    		a[i].id = i;
    		a[i].total = a[i].c + a[i].m + a[i].e;
    		a[i].highest = max(a[i].c, a[i].m);
    		a[i].sum = a[i].c + a[i].m;
    	}
    	sort(a + 1, a + n + 1, cmp);
    	ans[a[1].id] = 1;
    	last = 1;
    	for (int i = 2; i <= n; i++) {
    		if (check(last, i)) {//有并列的学生
    			ans[a[i].id] = p;//记录排名
    			k++;//是并列的学生,累加k
    			last = i;
    			continue;
    		}
    		p += k + 1;//并列结束,新的占位
    		k = 0;//记得清空
    		ans[a[i].id] = p;//记录排名
    		last = i;//更新缓存信息
    	}
    	for (int i = 1; i <= n; i++ ) {
    		cout << ans[i] << endl;
    	}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    5652
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者