Canada Trip 질문입니다.(타이오버 발생~)

  • iamnotyou
    iamnotyou

    푸는 방법을 몰라서..모범 답안을 참고하여, 조금 수정해서 풀었습니다.
    모범 답안 : -1 , 8030001 의 mid 값으로 hi / lo 가 변경되도록 되어있음
    mine : 입력데이타를 입력 받을때 첫 시작점과 마지막 끝점을 lo , hi 가 되도록 해서 mid 값으로 서칭

    마지막 위치를 찾았을때, 딱떨어지지 않아서 마지막값 찾는 부분 추가함.

    왜 타임오버 발생할까요?
    모범 답안과 대비해서 그리 수행 횟수가 늘어나는거 같지 않은데요..

    여기에 코드를 올리면 되나요?

    #include "stdio.h"
    
    int resultvalue;
    int city,qnum,maxd,mins;
    int table[5005][3];
    
    
    void check_des( int calc )
    {
        int des,count,i,calcdes,desv,mincal;
        do
        {
            des = (maxd - mins) / 2;
            des += mins;
            count = 0;
            calcdes = 8030000;
            mincal = 8030000;
    
    //각 도시마다 깃발이 몇개 있는지 확인합니다.
            for(i=0;i<city;i++)
            {
                if( (des >= table[i][1]) && (des <= table[i][0]))
                {
                    count += (des-table[i][1]) / table[i][2];
                    count +=1;              
                }
                else if( des > table[i][0])
                {
                    count += (table[i][0] - table[i][1])/table[i][2];
                    count +=1;
                }
    //저는 [i][1] 에 시작위치를 계산하여서 넣었습니다.
    //des 가 시작점 이후에 있을때 ( 이전에 있을때는 필요없어서,
    //count 완료되는 시점과 실제 위치에 오차가 있어서..이를 보완하는 부분입니다.
                if( des >= table[i][1])
                {
                calcdes = (des-table[i][1])%table[i][2];
                if( calcdes == 0 )
                    mincal = 0;
                if( (mincal != 0) && (calcdes < mincal) )
                    mincal = calcdes;
                }
    
            }
    
    //위치 재조정 해주는 부분입니다
            if( calc == count )
            {
                resultvalue = des - mincal;
                break;
            }
            else if( calc < count )
            {
                maxd = des;
            }
            else if( calc > count )
            {
                mins = des;
            }
        }while(1);
    }
    int main (int argc, char** argv)
    {
        int i,j,c,t,testcase;
        char in;
    
        //freopen("input.txt", "r", stdin);
        setbuf(stdout, NULL);
    
        scanf("%d", &testcase);
    
        for( t = 1; t <= testcase; t++)
        {
            resultvalue = 0;
            maxd = 0;
            mins = 8030000;
            for(i=0;i<5005;i++)
                for(j=0;j<3;j++)
                {
                    table[i][j] = 0;
                }
        //1. input을 받는다.
            scanf("%d", &city);
            scanf("%d", &qnum);
    
    //입력 받을때, 시작점을 따로 계산했고, 시작점중 가장 작은값과
    //end 지점 가장 큰값을 저장해뒀습니다.
            for(i=0;i<city;i++)
                for(j=0;j<3;j++)
                {
                    scanf("%d",&table[i][j]);
                    if( j==1 )
                    {
                        table[i][j] = table[i][0] - table[i][j];
                        if( i == 0 ) mins = table[i][j];
                        if( table[i][j] < mins )
                            mins = table[i][j];
                    }
                    if( j==0 )
                    {
                        if(table[i][0] > maxd)
                            maxd = table[i][0];
                    }
                }
    
            check_des(qnum);
    
        //2. solve      
            printf("%d\n",resultvalue);
        }
    }
    

    10년 전
2개의 댓글이 있습니다.
  • Being
    Being

    네 코드도 올려주시면 좋겠네요 :)


    10년 전 link
  • Kureyo
    Kureyo

    코드올릴때 양식은 글 편집 눌러서 밑에 있는 도움말을 참조해주세요


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.