先升序排序,找到第一个 题数小于他数量 大于等于 题数大于他数量的 ,如果找到的是 < 那我们只需要做到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 ; }