hdu 6092(二)

题目大意:

有一个数列 a[] ,长度(n<=50)。b[i] 表示元素和为 i 的集合个数。给你一个数列 b[] ,长度(m<=10000),让你求 a[],并按照其字典序最小输出。

分析:

首先,对于除了 b0 以外的第一个不为 0 的 bi ,数组 a[] 里面一定有 i,并且有 b[i]个(但是我不是一次就把这 b[i] 个一次性全拿出来,我一个一个拿) 。首先进行完拿出一个的操作之后,然后要对 b 进行操作,把 b 数组变成去除 i 后继续满足原定义。首先考虑,对于每一个和为 j 的组合(元素中没有 i ),把它里面加上一个元素 i 它就变成了一个和为 j+i 的组合。
也就是说:

j+iji=j+ii
所以按照这种方法就可以在:O(mn) 的时间内得到 n 个数,然后按照字典序最小输出即可。

注意尾部不能有空格。

代码:

#include
using namespace std;
int t,n,m;
long long int b[10050]={0};
int a[600]={0};
int main()
{scanf("%d",&t);while(t--){memset(b,0,sizeof(b));memset(a,0,sizeof(a));scanf("%d%d",&n,&m);for(int i=0;i<=m;i++){scanf("%I64d",&b[i]);}int k=0;for(int i=1;i<=m;i++){if(k>=n)break;if(i<=0)continue;if(b[i]!=0){a[k]=i;k++;for(int j=i;j<=m;j++){b[j]=b[j]-b[j-i];}i--;}}printf("%d",a[0]);for(int i=1;iprintf(" %d",a[i]);}printf("\n");}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部