数列删减,我一直二分死循环?
#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--
在学习数据结构的过程中我们会学很多数据结构,例如:二叉树、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);
}
}
输出结果: