杨大哥 这个我也能搞定 在北大的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 编辑 ]

梅尚程荀
马谭杨奚










望尘莫及啊 好好看看先。
(不需要实际解决,觉得自己可以,有思路就行)