Dzień dobry.
Mam problem z powyższym zadaniem, a dokładnie nie wyrabiam się w zadanym czasie.
Mój pomysł na rozwiązanie:
Każdy punkt ma dwa stany: możliwy i niemożliwy do użycia.
Przeszukuję dane w poszukiwaniu x_min, x_max, y_min, y_max (muszą być możliwe do użycia), po czym sprawdzam, z których można utworzyć największe pole. Te, które wybrałem, segreguję wg. kolejności rosnącej oraz oznaczam jako niemożliwe do użycia. Następnie je wypisuję.
Program kończę, gdy kończą mi się punkty.
Pomysł jest zły czy realizacja do bani?
KOD
include
include
using namespace std;
struct point
{
long long x;
long long y;
int b;
};
inline long long pole(point A, point B, point C)
{
return abs(0.5 * ((B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x)));
}
int main()
{
// DEFINICJA ZMIENNYCH
////////////////////////////////////////////////////////////////////
int D, N, i, j, k, a, pole_max = 0;
int x_min, x_max, y_max, y_min;
int p_x_min, p_x_max, p_y_min, p_y_max;
int tab_p[3];
point *S,pot[4];
////////////////////////////////////////////////////////////////////
// KONIEC DEFINICJI ZMIENNYCH
cin >> D;
while(D--)
{
cin >> N;
S = new point[N];
for(i = 0; i < N; i++)
{
cin >> S[i].x >> S[i].y;
}
for(i = 0; i < N; i++)
{
S[i].b = 1;
}
a = N / 3;
while(a--)
{
y_max = x_max = -1000000001;
y_min = x_min = 1000000001;
p_x_min = p_y_min = p_x_max = p_y_max = -1;
// WYSZUKIWANIE MINIMUM I MAXIMUM
////////////////////////////////////////////////////////////////////////
for(i = 0; i < N; i++)
{
if(x_max < S[i].x && S[i].b)
{
x_max = S[i].x;
p_x_max = i;
}
if(x_min > S[i].x && S[i].b)
{
x_min = S[i].x;
p_x_min = i;
}
if(y_max < S[i].y && S[i].b)
{
y_max = S[i].y;
p_y_max = i;
}
if(y_min > S[i].y && S[i].b)
{
y_min = S[i].y;
p_y_min = i;
}
}
/////////////////////////////////////////////////////////////////////////
// KONIEC WYSZUKIWANIA MINIMUM I MAXIMUM
// START WYSZUKIWANIA TROJKATA O NAJWIEKSZYM POLU
/////////////////////////////////////////////////////////////////////////
pole_max = 0;
pot[0] = S[p_x_max];
pot[1] = S[p_y_max];
pot[2] = S[p_x_min];
pot[3] = S[p_y_min];
for(i = 0; i < 2; i++)
{
for(j = i + 1; j < 3; j++)
{
for(k = j + 1; k < 4; k++)
{
if(pole_max < pole(pot[i], pot[j], pot[k]))
{
tab_p[0] = i;
tab_p[1] = j;
tab_p[2] = k;
}
}
}
}
/////////////////////////////////////////////////////////////////////////
// KONIEC WYSZUKIWANIA TROJKATA O NAJWIEKSZYM POLU
// START WPISYWANIA NUMEROW PUNKTOW DO TABLICY PEWNEJ
/////////////////////////////////////////////////////////////////////////
for(i = 0; i < 3; i++)
{
switch(tab_p[i])
{
case 0:
tab_p[i] = p_x_max;
break;
case 1:
tab_p[i] = p_y_max;
break;
case 2:
tab_p[i] = p_x_min;
break;
case 3:
tab_p[i] = p_y_min;
break;
}
}
/////////////////////////////////////////////////////////////////////////
// KONIEC WPISYWANIA NUMEROW PUNKTOW DO TABLICY PEWNEJ
// START SORTOWANIA NUMEROW PUNKTOW
/////////////////////////////////////////////////////////////////////////
for(i = 0; i < 3; i++)
{
for(j = i + 1; j < 3; j++)
{
if(tab_p[i] > tab_p[j]) swap(tab_p[i], tab_p[j]);
}
}
/////////////////////////////////////////////////////////////////////////
// KONIEC SORTOWANIA NUMEROW PUNKTOW
for(i = 0; i < 3; i++)
{
cout << tab_p[i] + 1 << " ";
S[tab_p[i]].b = 0;
}
cout << endl;
}
delete [] S;
cout << endl;
}
}
created
last reply
- 21
replies
- 1.9k
views
- 8
users
- 3
likes
- 4
links