Olympiad CF 222D(贪心)

题目链接:CodeForces - 222D

题意:一场奥林匹克运动会,有n个人参加,共两场比赛,已知Vasaya在这两场比赛中,至少总分得了k分,求出Vasaya可以获得的最好以及最差的名次。得分已知,但是具体是谁得的分未知,所以所有的分都可以随意组合。

思路:首先,已知的这个小孩的得分总分为至少k分,所以小孩的得分是无上限的!!最好的名次:第一名!

所以我们要求的,就是最差的名次。只要将下面的两组分数加起来,看看最多可以有几组大于k就好啦,组数就是这个小孩的名次。

其次我们还要知道,要是所有的人成绩都一样,那么排名就是裁判员管的,我们只能是得到最后一名。

综上,使用贪心,a从小到大排序,b从大到小排序,如果a[i]+b[j]>k,那么名次+1,b的j+1;如果小于,那么无论如何,这个a加任何一个b都不会比小孩的分数高,所以用更大的a(为了贪心贪更多的名次,所以a从小到大排序)。

代码:

#include <iostream>
#include <algorithm>
using namespace std;
int a[100100],b[100100];
int n,k,ans=0;
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<n;i++)
        cin>>b[i];
    sort(a,a+n);//贪心必备
    sort(b,b+n,cmp);
    for(int i=0,j=0;i<n;i++)
    {
        if(a[i]+b[j]>=k)//等于的情况也是我们输
        {
            ans++;//计数
            j++;//这个b使用之后,使用更小的b
        }
    }
   cout<<"1 "<<ans<<endl;
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值