2016-10-12 2 views
1

나는 C를 배웠고 this challenge을 해결하고 있는데, uva 플랫폼에 이것을 제출할 계획이 아닙니다.이 운동을 코딩하는 이유는 기울기 때문입니다. 문제에 대한 최선의 접근 방식이지만 노력 중입니다.QSort를 정의 구조체와 함께 사용

4 
3 
20 30 40 50 30 40 
Res: 2 
4 
20 30 10 10 30 20 40 50 
Res: 4 
3 
10 30 20 20 30 10 
Res: 2 
4 
10 10 20 30 40 50 39 51 
Res: 3 

각 입력 테스트에서 답변을 잘못하고 나는 이유는 qsort가 기능이라고 생각 :

내 터미널에서 인쇄 입력은 다음과 같다. 구조체를 사용하여 qsort 함수를 사용하는 방법에 대해 혼란 스럽다. array라고하는 구조체를 호출하고 sizeof (int)를 사용하여 입력 한 다음 크기를 사용하지만 int 또는 sizeof my를 사용해야합니다. 구조, 마지막으로 나는 비교 함수를 호출하고있다. 내 코드는 다음과 같습니다

#include <stdio.h> 
#include <string.h> 

struct Dolls{ 
    int w; 
    int h; 
}array[20005]; 

int cmp(struct Dolls a, struct Dolls b){ 
    if(a.w==b.w){ 
    return a.h < b.h; 
    }else{ 
    return a.w > b.w; 
    } 
} 

int arr[20005]; 
int dp[20005]; 
int n; 

int bSearch(int num, int k){ 
    int low=1; 
    int high = k; 
    int mid; 
    while(low<= high){ 
    mid = (low+high)/2; 
    if(num>=dp[mid]){ 
     low=mid+1; 
    }else{ 
     high=mid-1; 
    } 
    } 
    return low; 
} 

int res_dolls(){ 
    int k=1; 
    int i,pos; 
    dp[i]=arr[1]; 
    for(i=2;i<=n;i++){ 
    if(arr[i]>=dp[k]){ 
     dp[++k] = arr[i]; 
    }else{ 
     pos = bSearch(arr[i],k); 
     dp[pos] = arr[i]; 
    } 
    } 
    return k; 
} 

int main(){ 
    int t,j; 
    scanf("%d",&t); 
    while(t--){ 
    memset(array,0,sizeof(array)); 
    scanf("%d",&n); 
    for(j=1;j<=n;j++){ 
     scanf("%d %d",&array[j].w, &array[j].h); 
    } 
    qsort(array,n,sizeof(int),cmp); 
    for(j=1;j<=n;j++){ 
     arr[j] = array[j].h; 
    } 
    printf("%d\n",res_dolls()); 
    } 
    return 0; 
} 
+0

당신이'#include '을 잊어 버린 것을 잊었습니다. 컴파일러 경고를 최대화하십시오. –

답변

5

귀하의 cmp 함수는 qsort 작동하는 int (*)(const void *, const void *)으로 정의 될 필요가있다.

비교를 수행하는 방식이 올바르지 않습니다. 첫 번째 인수에 보다 tively 적은 respec- 동일한 것으로 간주되는 경우 비교 기능, 이상 제로보다 같은 정수 미만, 반환해야

, 또는 : qsort가의 man 페이지에서 두 번째보다 큽니다. 두 멤버가 동등한 것으로 비교되는 경우 정렬 된 배열의 순서는 입니다.

는 0 또는 명시 적으로 각각의 경우를 확인하고 적절한 값을 반환해야 1. 중 하나 인 < 또는 > 연산자의 결과를 반환하고있는 비교가.

qsort(array,n,sizeof(struct Dolls),cmp); 

편집 :

qsort에 대한 호출에 관해서는

int cmp(const void *va, const void *vb){ 
    const struct Dolls *a = va; 
    const struct Dolls *b = vb; 

    if(a->w > b->w) { 
     return 1; 
    } else if(a->w < b->w){ 
     return -1; 
    } else if(a->h > b->h) { 
     return 1; 
    } else if(a->h < b->h){ 
     return -1; 
    } else { 
    return 0; 
    } 
} 

, 당신은 서브 필드의 아닌 크기 전체 구조체 즉, 그것을 배열 요소의 크기를 줄 필요가

매개 변수 이름의 오류를 수정했습니다. 또한 비교 함수가 어떻게 동작해야하는지에 따라 정렬이 수행되는 방식이 변경되었습니다.

+0

모든 유형의 입력을 받아들이 기 위해 변경해야한다는 것을 알고 있지만 변경 한 경우이 경고가 나타납니다. 'a'를 'const struct Dolls *'와 'const void *'의 두 가지 유형으로 재정의하십시오. – user2737948

+0

오, 변수 이름이 단일 범위에서 두 번 사용되었다는 오류를 발견했습니다. Const struct Dolls * va = a를 변경하면 실수가 수정됩니다. – user2737948

+0

훨씬 더 낫다! – chux