标签:
根据一个序列,求下一个序列。如果一串数字是降序排列,则一定是组合成的最大的数字,只要这串数字中有地方是升序的,则不是组合成的最大数字。
比如:num[6] = 123654
从后向前,如果num[i] < num[i+1],则停止循环,在这里是3<6,则从num[i+1]后边的数字(5和4)里面找到一个数n,n满足条件n>3(num[i])&&n<6(num[i+1]),而且这个n是找到的满足条件里面的最小的(如果找不到这个n,则交换num[i]和num[i+1]),这时交换n和3(num[i]),则序列变成124563,然后把(num[i])4后边的数字从小到大排序,得到124356,就找到了下一个序列
第一遍用的cin和cout,超时了,后来换成scanf和printf就ac了,还是c的速度快
#include <cstdio> #include <algorithm> using namespace std; int n,k; int num[1025]; void process() { int i,j; for(i = n-2; i >= 0; --i) if(num[i] < num[i+1]) break; if(i == -1) { sort(num,num+n); return ; } int t = i+1; //如果从(t,n)找不到符合的,那么t就和i替换,所以从后向前循环比较好,因为t后边是降序排列的 for(j = n-1; j >= i+2; --j) if(num[j] > num[i] && num[j] < num[t]) break; int temp = num[j]; num[j] = num[i]; num[i] = temp; sort(num+t,num+n); return ; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&k); for(int i = 0; i < n; ++i) scanf("%d",&num[i]); for(int i = 0; i < k; ++i) process(); for(int i = 0; i < n; ++i) printf("%d ",num[i]); printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/guoyongheng/p/5723702.html