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

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

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;
}


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

for(int i=n;i>=n-x+1;i++){
你这个循环对吗?x的值是多少?如果x大于1,这就是死循环啊,得i--

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/845451
  • 这篇博客你也可以参考下:[牛客]有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。
  • 除此之外, 这篇博客: 【数据结构】为什么说二分查找是很牛的算法?中的 一、二分查找是什么? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在学习数据结构的过程中我们会学很多数据结构,例如:二叉树、AVLTree、哈希表、B数,而今天我要给大家介绍在有序的情况下的一种排序——二分查找,接下来请看代码实现。

    代码如下(示例):

    int BinarySearch(int arr[], int k, int sz)
    {
    	int left = 0;
    	int right = sz - 1;
    	while (left <= right)
    	{
    		int mid = (left + right) / 2;
    		if (arr[mid] < k)
    		{
    			left = mid + 1;
    		}
    		else if (arr[mid] > k)
    		{
    			right = mid - 1;
    		}
    		else
    		{
    			return mid;
    		}
    	}
    	if (left > right)
    	{
    		return -1;
    	}
    
    }
    int main()
    {
    	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int k = 0;
    	scanf("%d", &k);
    	int ret = BinarySearch(arr, k, sz);
    	if (ret == -1)
    	{
    		printf("没找到\n");
    	}
    	else
    	{
    		printf("找到了,下标是%d\n", ret);
    	}
    }
    

    输出结果:在这里插入图片描述
    在这里插入图片描述


  • 您还可以看一下 任大勇老师的人工智能算法竞赛实战课程中的 实战:二分类评价小节, 巩固相关知识点