lanqiao OJ 2143 最少刷题数

简介: lanqiao OJ 2143 最少刷题数

1.最少刷题数 - 蓝桥云课 (lanqiao.cn)

升序排序,找到第一个   题数小于他数量  大于等于  题数大于他数量的 ,如果找到的是 < 那我们只需要做到b[j]道  也就是说我们和这个中位数的值一样就行了, 但是如果我们找到的是 == , 那我们就得变了 ,要比这个中位数多一道题,这个可以用二分来找,但是用双指针似乎更简单些

#include<iostream>
#include<algorithm>
#include<cstring>
 
using namespace std ;
const int N = 1e5 +10 ;
int a[N] , b[N] ;
int main(){
  int n ; cin >> n ;
  for(int i = 1 ; i <= n ; i++){
    cin >> a[i] ;
    b[i] =a[i] ;
  }
  sort(b+1,b+n+1) ;//升序排序
  int j = 0 ;
  int ans = -1 ;
  for(int i = 1 ; i <= n && ans==-1;  ){ //找到第一个就停止循环
    j = i ++ ; //j为找到的数 ,让i去找第一个大于bj的数
    while(i <=n && b[j] == b[i]) i ++ ;//找第一个大于bj的数
    int l = j - 1 , r = n - i + 1 ;//判断一下, 左边数量,右边数量
    if(l < r) continue ;//如果左少右多 ,直接继续找
    else if(l > r) ans = b[j] ;//如果左多右少 , 把目标题目量做到b[j]就行了
    else ans = b[j] + 1 ;  //如果相等, 那我们需要做到b[j] + 1
  }
  for(int i = 1 ; i <= n ; i ++){对每一个进行判断
    int need = 0 ;
    if(a[i] < b[j]) need = ans - a[i] ;
    cout << need << " " ;
  }
  cout << endl ;
  return 0 ;
}
目录
相关文章
剑指offer题目汇总(三)
剑指offer题目汇总(三)
|
5月前
|
算法
剑指offer题目汇总(一)
剑指offer题目汇总(一)
|
3天前
lanqiao OJ 1388 寒假作业
lanqiao OJ 1388 寒假作业
15 0
|
3天前
lanqiao OJ 389 摆花
lanqiao OJ 389 摆花
8 2
|
3天前
lanqiao OJ 3513 岛屿个数(2023省赛)
lanqiao OJ 3513 岛屿个数(2023省赛)
9 2
|
3天前
lanqiao OJ 649 算式900
lanqiao OJ 649 算式900
10 1
|
1天前
lanqiao oj 1085 小猪存钱罐
lanqiao oj 1085 小猪存钱罐
6 0
|
1天前
lanqiao oj 1050 补给
lanqiao oj 1050 补给
8 0
|
2天前
lanqiao OJ 1217 求立方根
lanqiao OJ 1217 求立方根
7 0
|
2天前
lanqiao OJ 1591 “123”
lanqiao OJ 1591 “123”
9 0