您的位置:首页 > 其它

pku acm 1833

2012-06-05 10:37 260 查看
提交了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
)
k %= mp
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: