這題我的思路是這樣子:
先依照x座標排序 所有點皆先標示為極大點
由左到右迭代各點 清空各點與原點(0,0)構成的矩形範圍內原先被標記為極大點者之標記
剩下的點集合即是極大點~
想請教AC的版友們除這樣暴力作法外 有沒更好的方法??
另外總是在第三測資點爆炸...
想不出原因...Q.Q
希望可以提供任何建議及指教 謝謝‘
//////////////////// ****** 以下是錯誤訊息 ****** ///////////////////////
第 3 測資點(20%): RE (SIGSEGV)
執行時期錯誤
記憶體區段錯誤! Segmentation fault
////////////////////// ****** 以下是程式碼 ****** ///////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct point {
int x;
int y;
bool is_maximum;
};
int compare(const void *a,const void *b);
struct point board[100001];
int N=0,temp_N=0,i=0,j=0,serial=0;
int main() {
while(scanf("%d",&N)==1) {
temp_N = N;
for(i=0; i<N; ++i) {
scanf("%d %d",&board[i].x,&board[i].y);
board[i].is_maximum = true;
}
qsort(board,N,sizeof(board[0]),compare);
for(i=0; i<N; ++i) {
for(j=0; j<i; ++j) {
if(board[j].is_maximum&&((board[j].x<=board[i].x)&&(board[j].y<=board[i].y))) {
board[j].is_maximum = false;
--temp_N;
}
}
}
printf("Case %d: \n",++serial);
printf("Dominate Point: %d\n",temp_N);
for(i=0; i<N; ++i) {
if(board[i].is_maximum) {
printf("(%d,%d)\n",board[i].x,board[i].y);
}
}
}
return 0;
}
int compare(const void *a,const void *b) {
struct point* c = (struct point*)a;
struct point* d = (struct point*)b;
//先比較x 再比較y
if(c->x!=d->x) {
return c->x-d->x;
} else {
return c->y-d->y;
}
}