SPOJ Aggresive Cows AGGRCOW

SPOJ Aggresive Cows AGGRCOW
0

Cześć,
Jakbyście mieli chwilkę to moglibyście pomóc mi w znalezieniu błędu w tym kodzie:

Kopiuj
 #include<iostream>
#include<algorithm>
using namespace std;
int n,c;
int find(int mid,int array[])
{
	int cows=1,pos=array[0];
	for(int i=1;i<n;i++)
	{
		if(array[i]-pos>=mid)
		{
			pos=array[i];
			cows++;
			if(cows==c) return 1;
		}
	}
return 0;	
}
int bs(int array[])
{
	int low=0,high=array[n-1],max=-1;
	while(high>low)
	{
		int mid=(high+low)/2;
		if(find(mid,array)==1)
		{
			if(mid>max)
			{
				max=mid;
				low=mid+1;
			}
		}
	  
	else
	{
		high=mid;
	}
}
	return max;
}
int main()
{
	int t;
	cin>>t;
	
	while(t--)
	{
	cin>>n>>c;
	int arr[n];
	for(int i=0;i<n;i++)
	{
		cin>>arr[i];
	}
	sort(arr,arr+n);
	cout<<bs(arr);
}
	return 0;
}

Zadanie:
http://www.spoj.com/problems/AGGRCOW/

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:16 minut
0

sam pomysł na rozwiązanie wygląda Ok, zakładając, że dobrze rozumiem twoją intencję.
Trudno się czyta, bo używasz zmiennych globalnych i nazywasz zmienne tak, że trudno złapać o co chodzi.
Podczas bisekcji po co ci to max?
Jak już wjedziesz w tego ifa if(mid>max) to czemu ustawiasz low na wartość mid + 1? W końcu nie wiesz czy jest to wartość prawidłowa! To jest twój błąd

Na dodatek wartości początkowe powinny być takie:

  • low=1 (nie wsadzasz wszystkich krów do jednej zagrody, taki wynik jest raczej nieakceptowalny w tym zadaniu),
  • high = (array[n-1] - array[0]) / (c - 1) + 1 (najbardziej optymistyczny rozkład + 1 daje na pewno coś co ma nie da się wykonać, a jest dobrym ograniczeniem z góry).

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.