xxxalq 2023-07-12 12:42 采纳率: 33.3%
浏览 68
已结题

数列删减,我一直二分死循环?

数列删减,我一直二分死循环?

img

img

#include<iostream>
#include<algorithm>
using namespace std;
int a[200010],n,sum,T,k;
int f(int x){
    int s=sum;    
    if(x==0){
        return s;
    }
    if(n==1){
        return s-x;
    }
    if(x>=n){
        return (a[1]-x+n-1)*n;
    }else{
        for(int i=n;i>=n-x+1;i++){
            s=s-a[i]+a[1];
        }
        return s;
    }
}
int main(){
//    ios_base::sync_with_stdio(false);
//    cin.tie(NULL);
    cin>>T;
    while(T--){
        sum=0;
        cin>>n>>k;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            sum+=a[i];
        }
        sort(a+1,a+1+n);
        int l=0,r=sum-k,mid;
        while(l<r){
            mid=(l+r)/2;
            if(f(mid)>k){
                l=mid+1;
            }else{
                r=mid;
            } 
            cout<<1;
        }        
        cout<<l<<endl;
    }
    return 0;
}


  • 写回答

3条回答 默认 最新

  • 於黾 2023-07-12 13:52
    关注

    写for的时候,你要先想清楚i到底是要增大还是减小
    i如果是在增大,那么判断条件应该是<,后面要写i++
    而如果i是在减小,那么判断条件应该是>,后面要写i--
    如果i的方向和判断的方向相反,就是典型的死循环

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月21日
  • 已采纳回答 7月13日
  • 创建了问题 7月12日