안녕하세요
PICNIC 문제를 풀고 있는데요
시간 초과가 발생하고 있습니다.
혹시 제가 풀려는 방법으로는 시간초과를 개선할 수 없는지가 궁금해서요 확인이 가능하시면 부탁드립니다^^
PICNIC 문제는 모든 사람에게 짝을 지워 주는 문제 입니다.
그래서 저희 해결법은
비트연산을 통해 모든 경우의 수를 FOR문을 돌린다.
비트의 값이 1인 경우 짝을 지여 준다.
만약 모든 사람이 짝이 지어져 있으면 답을 ++ 한다.
아니면 빠져나와서 그다음 케이스로 넘어간다
우선 짝이 될수 있는 CASE들을 구조체에 담아서
위의 CASE를 수행하였는데요
해당 방법으로는 시간초과를 벗어날 방법이 없을까요??
코드
#include<iostream>usingnamespacestd;#define MAX 100inthowmanypeople;// 총 학생 수inthowmanygroup;// 총 그룹 수boolcheck_answer=true;boolskip_test=false;intanswer_cnt=0;typedefstructnode{intfirst_num;intsecond_num;}Group;Groupgroup[MAX];boolalready_visit[MAX]={false,};voidinput_(){cin>>howmanypeople;cin>>howmanygroup;for(inti=0;i<howmanygroup;i++){cin>>group[i].first_num;cin>>group[i].second_num;}}voidprint_(){for(inti=0;i<howmanygroup;i++){cout<<" "<<group[i].first_num<<" ";cout<<group[i].second_num;}cout<<endl;}voidinit_visit(){check_answer=true;skip_test=false;for(inti=0;i<howmanypeople;i++){already_visit[i]=false;}}voidinit_(){skip_test=false;answer_cnt=0;/* for (int i = 0; i < howmanygroup; i++){ group[i].first_num = 0; group[i].second_num = 0; }*/howmanygroup=0;howmanypeople=0;}voidsolving(){intfirst_num;intsecond_num;// 모든 TC를 계산//cout << (1 << howmanygroup )<< endl;for(inti=0;i<(1<<howmanygroup);i++){// 비트 검색을 통해 모든 경우의 수 검색for(intj=0;j<howmanygroup;j++){if(i&(1<<j)){// 값이 1인 경우만 짝 찾기를 수행first_num=group[j].first_num;// 첫번째 짝second_num=group[j].second_num;// 두번쨰 짝if(already_visit[first_num]==true||already_visit[second_num]==true){// 이미 짝이 있으면skip_test=true;// 정답 count하는 것을 skipbreak;// 테스트를 하지 않고 빠져 나온다}if(already_visit[first_num]==false&&already_visit[second_num]==false){// 짝이 없으면 짝을 만들어 준다already_visit[first_num]=true;already_visit[second_num]=true;}}}if(!skip_test){// 여기서 모두 짝이 있는지를 판단for(intz=0;z<howmanypeople;z++){if(already_visit[z]==false){// 짝이 없으면 스킵한다.check_answer=false;break;}}if(check_answer){// 모두 true면 모두 짝이 있으므로 정답 ++answer_cnt++;}}init_visit();}}intmain(intargc,char**argv){inttest_case;intT;cin>>T;for(test_case=1;test_case<=T;++test_case){input_();// print_();solving();cout<<answer_cnt<<endl;init_();}return0;}
hooly_compling
안녕하세요
PICNIC 문제를 풀고 있는데요
시간 초과가 발생하고 있습니다.
혹시 제가 풀려는 방법으로는 시간초과를 개선할 수 없는지가 궁금해서요 확인이 가능하시면 부탁드립니다^^
PICNIC 문제는 모든 사람에게 짝을 지워 주는 문제 입니다.
그래서 저희 해결법은
우선 짝이 될수 있는 CASE들을 구조체에 담아서
위의 CASE를 수행하였는데요
해당 방법으로는 시간초과를 벗어날 방법이 없을까요??
코드
8년 전