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

    }

}

  

你可能感兴趣的:(Graph)