bjfu1017组合的字典序

    xiaoxiao2026-04-19  3

    组合的字典序

    时间限制(C/C++):1000MS/3000MS          运行内存限制:65536KByte 总提交:114            测试通过:75

    描述

    一个组合问题可以抽象为从n-1个整数0、1、2 ... (n-1)中选取m个。选中的m个数构成序列,并且从小到大排列,称为生成序列。不同的生成序列按照字典序有先后顺序。一个生成序列的直接后继是另外一个生成序列:这个序列与其直接后继之间没有其他任何生成序列。最后一个生成序列之后的生成序列不存在,但可以人为地规定为每个元素的值都是-1。

    输入

    第一行是一个整数k,表示测试用例的多少。每个测试用例的输入是若干独立的行。 对每一个测试用例,其第一行是两个整数ni和mi(用单个空格隔开),第一个整数ni(ni在区间[2,30]中),表示了被选序列的大小;第二个整数mi(mi在区间[1, ni]中),表示被选出序列的大小。后面的mi行表示被选出的序列,每一行分别是一个正整数,在[0, ni-1]之中,并且递增排列。

    输出

    对每一个mi长度的输入序列,用mi行输出其直接后继(长度仍然是mi)。

    样例输入

    3 10 4 0 2 8 9 3 2 1 2 5 2 2 4

    样例输出

    0 3 4 5 -1 -1 3 4

    题目来源

    professor

    AC代码:

    #include <stdio.h> #define N 32 int f[N]; int main() { int k,i,j; int check(int n,int m); void print(int n,int m); scanf("%d",&k); while(k--) { int n,m; scanf("%d %d",&n,&m); for(i=0;i<m;i++) scanf("%d",&f[i]); j=check(n-1,m); if(j==1) { for(i=0;i<m;i++) printf("-1\n"); continue; } print(n,m); } return 0; } int check(int n,int m) { int flag=1,i; for(i=m-1;i>=0;i--) { if(f[i]==n) n--; else { flag=0; break; } } return flag; } void print(int n,int m) { int flag=0,i,j; for(i=0;i<m;i++) if(f[i]==(n-1)) { flag=i; break; } if(flag==0) { for(i=0;i<m-1;i++) printf("%d\n",f[i]); printf("%d\n",f[m-1]+1); } else { n-=2; for(i=flag-1;i>=0;i--) { if(f[i]==n) { n--; continue; } else { flag=i; break; } } if(i==-1) { for(i=0;i<m;i++) printf("-1\n"); } else { for(i=0;i<flag;i++) printf("%d\n",f[i]); j=f[flag]+1; for(i=flag;i<m;i++) { printf("%d\n",j); j++; } } } }

    转载请注明原文地址: https://ju.6miu.com/read-1309020.html
    最新回复(0)