杨大哥 这个我也能搞定 在北大的ACM上过了
不过是用C++写的 搞了个类 最近在学C++
不过发现自己的程序怎么好绕啊(成绩是 Memory 248k time 454MS 不理想啊)
贴出来 看能不能优化下 (不好意思 在C坛贴C++ 只是想和杨大哥交流算法,重点是配合杨大哥的调查)
[ 本帖最后由 有容就大 于 2012-5-30 20:03 编辑 ]
不过是用C++写的 搞了个类 最近在学C++
不过发现自己的程序怎么好绕啊(成绩是 Memory 248k time 454MS 不理想啊)
贴出来 看能不能优化下 (不好意思 在C坛贴C++ 只是想和杨大哥交流算法,重点是配合杨大哥的调查)
程序代码:
#include <iostream> using namespace std; int g_array[1024]; /////////////////////////// // construct the class /////////////////////////// class permutation { public: void set_array(int); void change(); int len; int array[1024]; }; void permutation::set_array(int i_n) { int i; len = i_n; for (i = 0; i < len; i++) array[i] = g_array[i]; } void permutation::change() { int i, flag = 0, j, k, temp, lager, min; for (i = len - 1; i >= 1; i--) { if (array[i] - array[i-1] == -1) continue; else break; } if (i == 0) flag = 1; else flag = 0; if (flag) { for (i = 0; i < len; i++) array[i] = i + 1; } else { for (i = len - 1; i >= 1; i--) { if (array[i] < array[i-1]) continue; else break; } i--; for (j = i + 1; j < len; j++) { if (array[j] > array[i]) lager = j; break; } for ( k = j + 1; k < len; k++) if (array[k] > array[i] && array[k] < array[lager]) lager = k; temp = array[lager]; array[lager] = array[i]; array[i] = temp; for (j = i + 1; j < len - 1; j++) { min = j; for (k = j + 1; k < len; k++) { if (array[min] > array[k]) min = k; } if (min != j) { int temp; temp = array[min]; array[min] = array[j]; array[j] = temp; } } } } //////////////////////////// // main entry point //////////////////////////// int main(void) { int m, n, k, i; permutation per; cin >> m ; while (m--) { scanf("%d%d", &n, &k); for (i = 0; i < n; i++) scanf("%d", &g_array[i]); per.set_array(n); for (i = 0; i < k; i++) per.change(); for (i = 0; i < n; i++) printf("%d ", per.array[i]); printf("\n"); } return 0; }
[ 本帖最后由 有容就大 于 2012-5-30 20:03 编辑 ]
梅尚程荀
马谭杨奚