提交了N次,还是TLE。郁闷~~
事实证明要选C++ 无语
#include <stdio.h> #include <stdlib.h> inline void swap(int *a, int i, int j) { int temp; temp = a[j]; a[j] = a[i]; a[i] = temp; } //找比k大的最小数 前提:a[b...e]是倒序的 并且总是存在一个比k大的数 int find(int *a, int b, int e, int k) { if (b == e) return b; if (b+1 == e) { if (a[e]>k) return e; return b; } int mid=(b+e)/2; if (a[mid]<k) return find(a, b, mid-1, k); return find(a, mid, e, k); } void Print(int *a, int n) { for (int i=0; i<n; i++) printf("%d ", a[i]); printf("\n"); } void reverse(int *a, int b, int e) { while (b < e) { swap(a, b, e); b++; e--; } } int Next(int *a, int n) { int i; for (i=n-1; i>0; i--) { if (a[i]>a[i-1]) { //在后面的数中寻找大于a[i-1]并且是最小的数 int k1= find(a, i, n-1, a[i-1]); swap(a, i-1, k1); reverse(a, i, n-1); return 1; } } return 0; } int mp[6] = { 1, 1, 2, 6, 24, 120 }; int main() { int m, n, k; int i; scanf("%d", &m); while (m--) { scanf("%d %d", &n, &k); int *a = (int *)malloc(n*sizeof(int)); i=0; while (i<n) { scanf("%d", &a[i++]); } if (n<5 && k > mp[n]) k %= mp[n]; while (k--) { if (!Next(a, n)) reverse(a, 0, n-1); } Print(a, n); free(a); } return 0; }
#include <stdio.h> #include <algorithm> using namespace std; int main() { int a[1024]; int m, n, k; int i; scanf("%d", &m); while (m--) { scanf("%d %d", &n, &k); i=0; while (i<n) { scanf("%d", &a[i++]); } while (k--) { if (!next_permutation(a, a+n)) sort(a, a+n); } for (i=0; i<n; i++) { printf("%d ", a[i]); } printf("\n"); } return 0; }