*[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;
    }
}

  

posted @ 2014-08-30 19:23  阿牧遥  阅读(246)  评论(0编辑  收藏  举报