2017-11-22 1 views
0

C로 다음과 같은 그리 디 알고리즘을 구현하려고합니다.욕심 많은 TV 시청 알고리즘

알렉스는 훌륭한 텔레비젼 팬입니다. 그는 그가 관심이있는 모든 TV 프로그램을 오늘 에 기록했습니다. 그의 목록에는 n 개의 쇼가 포함되어 있는데, 그 중 i 번은 순간 li에서 시작하여 순간 ri에서 끝납니다. 알렉스는 2 대의 TV를 소유하고 있습니다. 그는 두 개의 TV에서 두 개의 다른 프로그램을 동시에 시청할 수 있지만 한 번에 한 TV에서만 하나의 프로그램을 시청할 수 있습니다. 하나의 프로그램이 다른 프로그램이 시작될 때 동시에 이 시작되면 하나의 TV에서 시청할 수 없습니다. Alex는 모든 n 쇼를 확인하려고합니다. 2 대의 TV로 충분합니까? Alex에게 도움이되는 프로그램을 작성하십시오 답을 찾아보십시오. 입력 는 첫 번째 라인은 프로그램의 개수를 나타내는 하나 개의 정수를 포함한다. 다음 n 줄 각각은 i 번째 쇼의 시작 및 종료 시간 두 개의 정수를 포함합니다. 출력 알렉스 다음 (따옴표없이) "YES"인쇄 두 TV가 사용하는 모든 프로그램을 체크 아웃 할 수있는 경우. 그렇지 않으면 "아니오"(따옴표 제외)를 인쇄하십시오. 내 구현을 실행할 때마다


예 입력
3
1,2
2,3
4,5
출력
은 YES

단, I는 세그멘테이션 오류가 오류를받을 . 나는 그것이 내가 보지 않고있는 무엇인가다고 확신한다. 그러나 나는 이슈들을 좁힐 수 없다.

#include <stdio.h> 

int main(){ 

    const int num; 

    int A[num][2]; //should be declared after fscanf 

FILE* filePtr = fopen("input2.txt","r"); 

fscanf(filePtr, "%d\n", &num); 

    for(int i = 0; i < num; i++){ 
     fscanf(filePtr, "%d, %d\n", &A[i][0], &A[i][1]); 
    } 

    fclose(filePtr); 

    int temp[2]; 

    for(int i = 0; i < num; i++){ 
     for(int j = 0; j < (num - i) - 1; j++){ 
      if(A[j][0] > A[j+1][0]){ 
       temp[0] = A[j][0]; 
       temp[1] = A[j][1]; 
       A[j][0] = A[j+1][0]; 
       A[j][1] = A[j+1][1]; 
       A[j+1][0] = A[j+1][0]; 
       A[j+1][1] = A[j+1][1]; 
      } 
     } 

    } 

    int TV1 = 0, TV2 = 0; 
    int currentShow = 0; 

    for(int i = A[0][0]; i <= A[num-1][0] && currentShow < num; i++){ 
     if(i == A[currentShow][0]){ 
      if(TV1 == 0) TV1 = A[currentShow][1] - A[currentShow][0]; 
      else if(TV2 == 0) TV2 = A[currentShow][1] - A[currentShow][0]; 
      else{ 
       printf("No.\n"); 
       break; 
      } 
      currentShow++; 
     } 

     if(TV1 > 0) TV1--; 
     if(TV2 > 0) TV2--; 
    } 

    if(currentShow == num) printf("Yes.\n"); 

    return 0; 
} 
+0

"한 쇼가 동시에 끝나면 다른 쇼가 시작되어 단일 TV에서 볼 수 없습니다."- 왜 안 되니? – paxdiablo

+0

@paxdiablo 질문을 디자인하지 않았다는 것을 모르겠다 – Noah210012

+4

알았어, 노아, 내 아이들이 하나의 TV에서 연속적인 찌꺼기가 끊임없이 쏟아지는 시간을 보면서 완벽하게 잘 지켜본 이래서 이상하게 보였다. 어쨌든 내 대답 좀 봐. – paxdiablo

답변

4
const int num; 
int A[num][2]; 

이것은 당신이 A을 만들 때 num는 아무것도 설정되어 있지 않은, 오히려 심각한 문제 : 다음은 내 코드입니다. 그것은 끝내기가 쉽지 않습니다.

num을 치수 지정자로 사용하려는 경우 해당 문자가 무엇인지 (처음 fscanf 이후) 알 때까지 기다려야합니다. 컴파일러는 잘하지만 나는 우리가 :-)만큼 그들은 같은 시간 규칙이 적용되는 꽤 확신

같은 날 밖으로 점프 다른 것들의 호스트도 있습니다 :

  • 되지는 fopen 또는 fscanf의 반환 값 확인. 이 const을 표시 비록 num을 수정하려고
  • . 그 고정

또한 문제를 해결하는 방향으로 먼 길을 갈 것입니다.

FILE* filePtr = fopen("input2.txt", "r"); 
if (filePtr == NULL) { 
    fprintf(stderr, "Could not open input file\n"); 
    return 1; 
} 

과 : 당신은 일반적으로 같은 나중에 다운 스트림 영향을 미칠 수 어떤 통화를 확인해야합니다 여담으로,

if (fscanf(filePtr, "%d, %d\n", &A[i][0], &A[i][1]) != 2) { 
    fprintf(stderr, "Could not get two integers from file\n"); 
    fclose(filePtr); 
    return 1; 
} 

을, 나는 아니에요 전 알고리즘이 어떻게 작동하는지 완전히 이해합니다.이해하기 쉽고 디버깅하기 쉽도록 별도의 모듈로 나누는 것이 가치가 있습니다.

내가 취하는 접근 방식은 관심있는 모든 시간대를 해결하는 것입니다. 귀하의 경우에는 최소 1에서 maximum 5 '까지입니다.

그런 다음 모든 항목에 대해 표시되는 기간을 계산하십시오. 그것이 2 이상이면 2 개의 TV가 분명히 작동하지 않을 것입니다. 보기의 개념적인 관점에서

은, 테스트 데이터는 다음과 같습니다

Timepoint Appears-in: 1-2 2-3 4-5 count 
--------- -------------------------- ----- 
    1     yes no no  1 
    2     yes yes no  2 
    3     no yes no  1 
    4     no no yes 1 
    5     no no yes 1 

그래서 하나의 괜찮습니다.

+0

고맙습니다. @paxdiablo! 나는 당신의 제안들 중 일부를 가지고 코드를 편집했으나 여전히 seg fault를 얻고있다. 왜 그런가? – Noah210012

+0

@ 노아, 답을 무효로하는 방식으로 질문을 편집하는 것이 좋은 형태로 여겨지지는 않습니다. 그렇기 때문에 그것은 Q & A 성향의 목적에 어긋납니다. 설명을 추가하기 위해 * 세부 사항을 추가해도 괜찮습니다. 그렇게하기를 권합니다. – paxdiablo

+0

죄송합니다. 나는 당신의 제안을 구현했다는 것을 보여 주려고 노력했다. 어쨌든, 심지어 그 자리에, 나는 여전히 세그먼트 오류 오류가 발생하고 이유를 모르겠다. 아마도 내 fopen/fclose와 관련이 있습니까? 나는 전에 이것을 사용한 적이 없다. – Noah210012

관련 문제