Codeforces 1017A The Rank(排序)

题目链接:The Rank

题意

一个班上有 n n 个学生,每个学生都有一个 id 和四门课的成绩,每个学生的 id i d 1 1 n 之间的整数,每个学生的 id i d 都不相同,将所有学生按总分从高到低排序,若总分相同则按 id i d 从小到大排序,问 id i d 1 1 的学生最终排在第几名。

输入

第一行为一个整数 n (1n1000),接下去 n n 行每行 4 个整数 ai,bi,ci,di (0ai,bi,ci,di100) a i , b i , c i , d i   ( 0 ≤ a i , b i , c i , d i ≤ 100 ) ,第 i i 行的 4 个整数表示 id i d 号为 i i 的学生四门课的成绩。

输出

输出最终 id 1 1 的学生的排名。

样例

输入
5
100 98 100 100
100 100 100 100
100 100 99 99
90 99 90 100
100 98 60 99
输出
2
提示
5 个学生的总分分别为 398,400,398,379,357 398 , 400 , 398 , 379 , 357 id i d 1 1 的学生的分数和 id 3 3 的分数相等,但是他的 id 值更小,所以他排在第 2 2 名。
输入
6
100 80 90 99
60 60 60 60
90 60 100 60
60 100 60 80
100 100 0 100
0 0 0 0
输出
1
提示
6 个学生的总分分别为 369,240,310,300,300,0 369 , 240 , 310 , 300 , 300 , 0 id i d 1 1 的学生分数最高,所以他是第 1 名。

题解

按照总分为主关键字, id i d 为次关键字排序,然后 O(n) O ( n ) 扫一遍找到 id i d 1 1 <script type="math/tex" id="MathJax-Element-36">1</script> 的学生的排名。

过题代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iomanip>
using namespace std;

#define LL long long
const int maxn = 1000 + 100;
struct Node {
    int sum, id;
};

bool operator<(const Node &a, const Node &b) {
    return a.sum == b.sum? a.id < b.id: a.sum > b.sum;
}

int n, num;
Node node[maxn];

int main() {
    #ifdef LOCAL
    freopen("test.txt", "r", stdin);
//    freopen("test1.out", "w", stdout);
    #endif // LOCAL
    ios::sync_with_stdio(false);

    while(scanf("%d", &n) != EOF) {
        for(int i = 1; i <= n; ++i) {
            node[i].sum = 0;
            node[i].id = i;
            for(int j = 0; j < 4; ++j) {
                scanf("%d", &num);
                node[i].sum += num;
            }
        }
        sort(node + 1, node + 1 + n);
        int ans = 0;
        for(int i = 1; i <= n; ++i) {
            if(node[i].id == 1) {
                ans = i;
                break;
            }
        }
        printf("%d\n", ans);
    }

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值