*[hackerrank]Lexicographic paths
https://www.hackerrank.com/contests/w9/challenges/lexicographic-steps
这题还是折腾很久的。题目意思相当于,比如有两个1两个0,那么找组成的数里第k大的。想法就是,如上例,假如K为4,那么先看后两位够了么C(2,2)=1,不够,那么看后三位C(3,2)=3,也不够,后四位是C(4,2)=6,够了,那么第一个1在倒数第4位。然后减去C(3,2)继续做。
#include <iostream> #include <vector> using namespace std; int main() { int t; cin >> t; while (t--) { int n, m, k; cin >> n >> m >> k; k++; string s; s.resize(m + n); while (m > 0) { // find pos for the first remaining V int x = m; int lastR = 0; int r = 1; while (k > r) { lastR = r; x++; r = r * x / (x - m); } // r >= k, fill one V s[s.size() - x] = 'V'; m--; k -= lastR; } for (int i = 0; i < s.size(); i++) { if (s[i] != 'V') s[i] = 'H'; } cout << s << endl; } }