푸는 방법을 몰라서..모범 답안을 참고하여, 조금 수정해서 풀었습니다.
모범 답안 : -1 , 8030001 의 mid 값으로 hi / lo 가 변경되도록 되어있음
mine : 입력데이타를 입력 받을때 첫 시작점과 마지막 끝점을 lo , hi 가 되도록 해서 mid 값으로 서칭
마지막 위치를 찾았을때, 딱떨어지지 않아서 마지막값 찾는 부분 추가함.
왜 타임오버 발생할까요?
모범 답안과 대비해서 그리 수행 횟수가 늘어나는거 같지 않은데요..
여기에 코드를 올리면 되나요?
#include "stdio.h"intresultvalue;intcity,qnum,maxd,mins;inttable[5005][3];voidcheck_des(intcalc){intdes,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;}elseif(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;}elseif(calc<count){maxd=des;}elseif(calc>count){mins=des;}}while(1);}intmain(intargc,char**argv){inti,j,c,t,testcase;charin;//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);}}
iamnotyou
푸는 방법을 몰라서..모범 답안을 참고하여, 조금 수정해서 풀었습니다.
모범 답안 : -1 , 8030001 의 mid 값으로 hi / lo 가 변경되도록 되어있음
mine : 입력데이타를 입력 받을때 첫 시작점과 마지막 끝점을 lo , hi 가 되도록 해서 mid 값으로 서칭
마지막 위치를 찾았을때, 딱떨어지지 않아서 마지막값 찾는 부분 추가함.
왜 타임오버 발생할까요?
모범 답안과 대비해서 그리 수행 횟수가 늘어나는거 같지 않은데요..
여기에 코드를 올리면 되나요?
11년 전