HDU
来源:互联网 发布:类似聚合数据的网站 编辑:程序博客网 时间:2024/06/07 10:19
题目大意:
有一个数列 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 的组合。
也就是说:
所以按照这种方法就可以在:O(mn) 的时间内得到 n 个数,然后按照字典序最小输出即可。
注意尾部不能有空格。
代码:
#include<bits/stdc++.h>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;i<k;i++) { printf(" %d",a[i]); } printf("\n"); }}
阅读全文
2 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 项目中经常犯得错误,LoadTexture的引用
- 练习4
- JavaScript浅学习(一)
- 深入理解Objective-C:KVC&KVO
- (15)根据不同盒子和下拉菜单选择颜色,给文本赋予不同的颜色
- HDU
- L
- libcoap 简单测试
- mongodb安装与基本查找操作:学习整理(一)
- vue.js 对比 angularJS、react 前端框架
- ARKit文档(部分翻译)及demo效果展示
- 记一个video处理全屏的问题
- 【QT】Qt Compiler Detection(编译)
- 【HDU 1176】免费馅饼( dp )