Olympiad(贪心+二分)

题目链接:传送门

题意描述:

        Vasya去参加奥利匹克大赛,比赛分两场,有n个人参加。他的老师已经知道的比赛的得分,但具体得分的是谁不知道,也知道了Vasya两场比赛加起来至少k分,让你判断Vasya的最好和最坏名次(如果两名选手得分相同,那么有裁判决定名次)。

题意分析:

       最好的成绩当然是第一名啦,这毋庸置疑的了。首先要明白,如果有多个人得分相同,那么最坏的名次当然是最后了,因为得分相同由裁判决定名次嘛。然后就是贪心了,我们要知道,最差的名次就是要组成尽量多的组评分大于等于k的,组数就是最差的成绩了。我们先把第一组数据a排序,然后在数组第二组数据的时候在第一组数据二分找出大于等于k-b[i]的最小值,然后让b[i]和找出来的数匹配,删除a数组里面的那个值,那样子的话就可以贪心的取得最多的评分大于等于k的评分了。

代码:

#include<bits/stdc++.h>
using namespace std;
vector<int>Q;
int n, k;
int main(){
    cin >> n >> k;
    int t;
    for(int i=0;i<n;++i){
        scanf("%d", &t);
        Q.push_back(t);
    }
    sort(Q.begin(), Q.end());
    int ans = 0;
    vector<int>::iterator it;
    for(int i=0;i<n;++i){
        scanf("%d", &t);
        it = lower_bound(Q.begin(), Q.end(), k-t);
        if(it != Q.end()){
            ans++;
            Q.erase(it);
        }
    }
    cout << "1 " << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41100093/article/details/87865348