#11216: 總是在第三測資點爆炸...


vagrantlike (丫維)

學校 : 不指定學校
編號 : 27614
來源 : [114.24.87.102]
最後登入時間 :
2020-01-23 17:45:52
d555. 平面上的極大點 -- 名題精選百則 | From: [163.29.253.105] | 發表日期 : 2016-07-28 17:57

這題我的思路是這樣子:

先依照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;
    }
}

 
ZeroJudge Forum