Submission #15528

#TimeUsernameProblemLanguageResultExecution timeMemory
15528yukariko분배 (kriii3_Q)C++98
24 / 24
426 ms4020 KiB
#include <iostream> #include <algorithm> #include <cstdio> #include <vector> #include <list> using namespace std; int a[16]; bool visit[1 << 16]; int N,K; list<int> p[17]; bool end; int sel[1<<16]; void solve(int pos, int depth, int cnt, int sum) { if(cnt == 0 && sum == 0) { sort(sel, sel+depth); for(int i=0; i < depth; i++) { cout << sel[i] << " "; } cout << "\n"; end = true; return; } if(pos > N || cnt == 0 || sum < pos) return; if(p[pos].empty()) return solve(pos+1, depth, cnt, sum); // no select solve(pos+1, depth, cnt, sum); if(end) return; // select //sel[depth] = p[pos].back(); sel[depth] = pos; p[pos].pop_back(); solve(pos, depth+1, cnt-1, sum - pos); if(!end) p[pos].push_back(sel[depth]); } int main() { cin >> N >> K; a[0] = 0; for(int i=1; i <= 16; i++) a[i] = a[i-1] * 2 + (1 << (i-1)); int one_put = a[N] / (1 << K); int n_put = 1 << (N-K); for(int i=0, n = 1 << N; i < n; i++) { int count = 0; for(int j = i; j; j >>= 1) count += j & 1; p[count].push_back(i); } for(int n = 1 << K; n--;) { int P=0,Q=0; for(int j=0,k=0; j <= N && k < n_put; j++) { if(p[j].empty() || p[N-j].empty()) continue; if(j == N-j && p[j].size() < 2) continue; cout << p[j].back() << " "; p[j].pop_back(); cout << p[N-j].back() << " "; p[N-j].pop_back(); k+=2; P += N; j--; } cout << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...