我发现只要有两个数据相同,那么这个数会直接爆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);
}