A79547.contest 正经题解
2025-09-28 19:40:31
发布于:广东
18阅读
0回复
0点赞
题目解析:
要求小Y最低多少名,即求最多有多少人的总分比小Y高,其中DAY1+DAY2的分数可以随意组合
思路:
cnt储存总分比小Y高的最多人数,a和b数组储存DAY1和DAY2的分数。
输入后用sort将DAY1分数降序排列,DAY2分数升序排列,以此遍历还未组合过的的最大值和最小值
将DAY1的最高分,与DAY2的最低分遍历,i和j作为a b数组的遍历指针
若总分大于小Y的总分S,则将这一对分数视作下一名(若第一次大于S则为第一名),此时cnt++;
否则与DAY2第二小的分数比较,以此类推。
以上两行通过while实现,在满足第一种情况后即可寻找剩余DAY1分数的最大分数与DAY2分数,
因为a数组递减,b数组递增,所以不存在更小的DAY2分数与当前的DAY1分数可以超过s。
注意:
正整数总分最大值为4×10^9,所以可以用无符号整形unsigned int
储存
#include <bits/stdc++.h>
using namespace std;
bool cmp(unsigned int a,unsigned int b){
return a > b;
}
int main(){
freopen("contest.in","r",stdin);
freopen("contest.out","w",stdout);
unsigned int n,s,cnt=0;
cin >> n >> s;
unsigned int a[n],b[n];
for(int i=0;i<n;i++) cin >> a[i];
for(int i=0;i<n;i++) cin >> b[i];
sort(a,a+n,cmp);
sort(b,b+n);
for(int i=0,j=0;i<n && j<n;i++,j++){
while(a[i]+b[j] < s && j<n) j++; // 不断将b数组指针j后移,直到啊a[i]+b[j](即剩余可组合的最高总分)大于s
if(j != n) cnt++;
}
cout << cnt+1;
fclose(stdin);
fclose(stdout);
return 0;
}
别忘了最后输出时要将cnt加1,因为还要算上小Y自己,这样就AC了
这里空空如也
有帮助,赞一个