蓝桥杯2022年第十三届省赛真题-最少刷题数

文章描述了一个C++编程问题,涉及如何根据学生的分数排名确定在达到某个分数(如中位数)之前需要额外刷多少道题。算法考虑了分数相同情况下的不同处理策略。
摘要由CSDN通过智能技术生成

在这里插入图片描述

solution(通过50%)

忽略了存在分数相同的情况,若从p位置开始有若干个相同分数的无需再多刷,但是在p位置前若干个(含p位置)分数相同则都需要多刷一道题。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn], b[maxn], f[maxn];
int main(){
	int n, p;
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		scanf("%d", a + i);
		b[i] = a[i];
	}
	sort(b + 1, b + n + 1);//名次到分数 
	p = n / 2 + 1;//首位到达刷题数的位置
	for(int i = 1; i <= n; i++){
		if(i >= p) f[b[i]] = 0;//分数对应的需刷题数
		else f[b[i]] = b[p] - b[i] + 1;
	} 
	for(int i = 1; i <= n; i++){
		printf("%d ", f[a[i]]);
	}
	return 0;
}

solution

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn], b[maxn], f[maxn];
int main(){
    int n, p, l, r;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", a + i);
        b[i] = a[i];
    }
    sort(b + 1, b + n + 1);//名次到分数 
    p = n / 2 + 1;//中间位置 
    l = lower_bound(b + 1, b + n + 1, b[p]) - b - 1;//中间位置元素前的第一个位置 
    r = upper_bound(b + 1, b + n + 1, b[p]) - b;//中间位置元素后的第一个位置 
    for(int i = 1; i <= n; i++){
        if(a[i] == b[p]){//对于中间位置元素值的处理 
        	if(l >= n - r + 1) printf("0 ");//已经满足 多 <= 少 ,则无需多刷题 
        	else printf("1 ");//不满足 多 <= 少,需要多刷一道题超过同分数的人来达成条件 
		}
		else if(l > n - r + 1) printf("%d ", max(0, b[p] - a[i]));//当 少 > 多 时,对于题量足够的同学无需再刷(下同);对于题量不够的同学至少要刷到中间位置 
		else printf("%d ", max(0, b[p] - a[i] + 1));//当 少 <= 多, 对于题量不够的同学至少要超过中间位置同学的题量.注意等于的情况,再变成中间位置,只会让少 < 多 
    } 
    return 0;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值