题目链接: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;
}