HDU 6628 permutation 1 (暴力)
2019 杭电多校 5 1005
题目链接:HDU 6628
比赛链接:2019 Multi-University Training Contest 5
Problem Description
A sequence of length
is called a permutation if and only if it's composed of the first
positive integers and each number appears exactly once.
Here we define the "difference sequence" of a permutation
as
. In other words, the length of the difference sequence is
and the
-th term is
Now, you are given two integers
. Please find the permutation with length
such that the difference sequence of which is the
-th lexicographically smallest among all difference sequences of all permutations of length
.
Input
The first line contains one integer
indicating that there are
tests.
Each test consists of two integers
in a single line.
![]()
![]()
Output
For each test, please output
integers in a single line. Those
integers represent a permutation of
to
, and its difference sequence is the
-th lexicographically smallest.
Sample Input
7 3 1 3 2 3 3 3 4 3 5 3 6 20 10000
Sample Output
3 1 2 3 2 1 2 1 3 2 3 1 1 2 3 1 3 2 20 1 2 3 4 5 6 7 8 9 10 11 13 19 18 14 16 15 17 12
Solution
题意:
定义排列 的 "difference sequence" 为
。现在给定
和
,求长度为
的所有排列中 "difference sequence" 的字典序第
小的排列。
题解:
暴力 STL 全排列
题目给定 的范围不超过
,而
,因此可以预处理
的情况,当
时暴力求
的全排列。
Code
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; struct P { int num[10]; string str; } ans[10][maxn]; int cmp(P p1, P p2) { return p1.str < p2.str; } int main() { int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; for(int i = 2; i <= 8; ++i) { int cnt = 1; do { // for(int j = 0; j < i; ++j) { // cout << a[j] << " "; // } // cout << endl; for(int j = 1; j <= i; ++j) { ans[i][cnt].num[j] = a[j]; if(j < i) ans[i][cnt].str += a[j + 1] - a[j] + 'A'; } ++cnt; } while(next_permutation(a + 1, a + 1 + i)); sort(ans[i] + 1, ans[i] + cnt, cmp); // for(int j = 1; j < cnt; ++j) { for(int k = 1; k <= i; ++k) cout << ans[i][j].num[k] << ""; cout << endl;} } int T; cin >> T; while(T--) { int n, k; scanf("%d%d", &n, &k); if(n <= 8) { for(int j = 1; j <= n; ++j) { printf("%d", ans[n][k].num[j]); printf("%s", j == n? "\n": " "); } } else { int a[30]; a[1] = n; for(int i = 2; i <= n; ++i) { a[i] = i - 1; } for(int i = 0; i < k - 1; ++i) { next_permutation(a + 1, a + 1 + n); } for(int i = 1; i <= n; ++i) { printf("%d", a[i]); printf("%s", i == n? "\n": " "); } } } return 0; }