二分求大佬弥补一下思路缺陷(已经知道错误在哪对如何改没有思路)
查看原帖
二分求大佬弥补一下思路缺陷(已经知道错误在哪对如何改没有思路)
874984
ho33楼主2022/11/29 21:53

我发现只要有两个数据相同,那么这个数会直接爆1(我当时的思路是把所有数排序,然后后一个数减去前一个数如果等于1那么这个小组的长度就加一,正是由于这种思路导致如果输入1 1 ....直接爆1),求大佬看看我的思路能否改进或者说应该直接换一种思路来做```c #include<stdio.h> void quick_sort(long long left,long long right,long long *arr) { if(left >= right) { return; } long long i = left; long long j = right; long long temp = arr[left]; long long zcs = 0; while(i != j) { while(arr[j]>=temp&&i < j) { j--; } while(arr[i] <=temp&&i < j) { i++; } if(i < j) { zcs = arr[i]; arr[i] = arr[j]; arr[j] = zcs; } } arr[left] = arr[i]; arr[i] = temp; quick_sort(left, i - 1, arr); quick_sort(i + 1, right, arr); } int check(long long *arr,long long n,long long mid) { //来判断当前队列到底有多少人 long long temp = 1; for (long long i = 1; i < n;i++) { if(arr[i] - arr[i-1]==1) { temp++; } else { if(temp >= mid) { temp = 1; } else { return 0; } }
} //检查特殊情况 if(temp < mid) { return 0; } return 1; } int main() { long long n = 0; long long arr[100002]; scanf("%lld", &n);

for (long long i = 0; i < n;i++)
{
    scanf("%lld",&arr[i]);
}
quick_sort(0, n - 1, arr);
//将数列排序结束后开始二分答案
//首先数列的人数不可能大于n
long long left = 0;
long long right = n;
while(left < right)
{
    long long mid = left + (right - left + 1) / 2;
    if(check(arr,n,mid) == 1)
    {
        left = mid;
    }
    else
    {
        right = mid - 1;
    }
}
printf("%lld",left);

}

2022/11/29 21:53
加载中...