제출 #411267

#제출 시각아이디문제언어결과실행 시간메모리
411267nxteru저울 (IOI15_scales)C++14
71.43 / 100
514 ms476 KiB
#include "scales.h" #include <bits/stdc++.h> using namespace std; void init(int T) { /* ... */ } struct data{ vector<vector<int>>x; vector<vector<int>> addHeaviest(vector<int>a,int p){ vector<vector<int>>res; for(auto v:x){ bool ok=true; for(auto i:a){ if(v[i]>v[p])ok=false; } if(ok)res.push_back(v); } return res; } vector<vector<int>> addLightest(vector<int>a,int p){ vector<vector<int>>res; for(auto v:x){ bool ok=true; for(auto i:a){ if(v[i]<v[p])ok=false; } if(ok)res.push_back(v); } return res; } vector<vector<int>> addMedian(vector<int>a,int p){ vector<vector<int>>res; for(auto v:x){ bool ok=true; int ma=-1,mi=10; for(auto i:a){ ma=max(ma,v[i]); mi=min(mi,v[i]); } if(ma==v[p]||mi==v[p])ok=false; if(ok)res.push_back(v); } return res; } vector<vector<int>> addNext(vector<int>a,int q,int p){ vector<vector<int>>res; for(auto v:x){ bool ok=true; int mi=10,mii=10; for(auto i:a){ mii=min(mii,v[i]); if(v[q]<v[i])mi=min(mi,v[i]); } if(mi==10)mi=mii; if(mi!=v[p])ok=false; if(ok)res.push_back(v); } return res; } vector<int> Next(void){ int mi=1000; vector<int>res; vector<int>pp={0,1,2,3,4,5}; bool vis1[6*6*6],vis2[6*6*6*6]; for(int i=0;i<6*6*6;i++)vis1[i]=false; for(int i=0;i<6*6*6*6;i++)vis2[i]=false; do{ int p[4]={pp[0],pp[1],pp[2],pp[3]}; sort(p,p+3); int s=p[0]+p[1]*6+p[2]*6*6; if(!vis1[s]){ vector<int>a; for(int i=0;i<3;i++)a.push_back(p[i]); int ma=0; for(int i=0;i<3;i++)ma=max(int(addHeaviest(a,a[i]).size()),ma); if(ma<mi){ mi=ma; res=a; res.push_back(0); } ma=0; for(int i=0;i<3;i++)ma=max(int(addLightest(a,a[i]).size()),ma); if(ma<mi){ mi=ma; res=a; res.push_back(1); } ma=0; for(int i=0;i<3;i++)ma=max(int(addMedian(a,a[i]).size()),ma); if(ma<mi){ mi=ma; res=a; res.push_back(2); } vis1[s]=true; } s+=p[3]*6*6*6; if(!vis2[s]){ vector<int>a; for(int i=0;i<3;i++)a.push_back(p[i]); int ma=0; for(int i=0;i<3;i++)ma=max(int(addNext(a,p[3],a[i]).size()),ma); if(ma<mi){ mi=ma; res=a; res.push_back(p[3]); res.push_back(3); } vis2[s]=true; } }while(next_permutation(pp.begin(),pp.end())); return res; } }; void orderCoins() { data d; vector<int>p={0,1,2,3,4,5}; do{ d.x.push_back(p); }while(next_permutation(p.begin(),p.end())); while(d.x.size()>1){ vector<int>q=d.Next(); if(q.back()==0){ q.pop_back(); d.x=d.addHeaviest(q,getHeaviest(q[0]+1,q[1]+1,q[2]+1)-1); }else if(q.back()==1){ q.pop_back(); d.x=d.addLightest(q,getLightest(q[0]+1,q[1]+1,q[2]+1)-1); }else if(q.back()==2){ q.pop_back(); d.x=d.addMedian(q,getMedian(q[0]+1,q[1]+1,q[2]+1)-1); }else{ q.pop_back(); int x=q.back(); q.pop_back(); d.x=d.addNext(q,x,getNextLightest(q[0]+1,q[1]+1,q[2]+1,x+1)-1); } } int ans[6]; for(int i=0;i<6;i++){ ans[d.x[0][i]]=i+1; } answer(ans); }

컴파일 시 표준 에러 (stderr) 메시지

scales.cpp: In function 'void init(int)':
scales.cpp:5:15: warning: unused parameter 'T' [-Wunused-parameter]
    5 | void init(int T) {
      |           ~~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...