HDU6092 Rikka with Subset
2017-08-08 20:30
351 查看
Rikka with Subset
[align=center]Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 403 Accepted Submission(s): 173
[/align]
[align=left]Problem Description[/align]
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:
Yuta has n
positive A1−An
and their sum is m.
Then for each subset S
of A,
Yuta calculates the sum of S.
Now, Yuta has got 2n
numbers between [0,m].
For each i∈[0,m],
he counts the number of is
he got as Bi.
Yuta shows Rikka the array Bi
and he wants Rikka to restore A1−An.
It is too difficult for Rikka. Can you help her?
[align=left]Input[/align]
The first line contains a number
t(1≤t≤70),
the number of the testcases.
For each testcase, the first line contains two numbers
n,m(1≤n≤50,1≤m≤104).
The second line contains m+1
numbers B0−Bm(0≤Bi≤2n).
[align=left]Output[/align]
For each testcase, print a single line with
n
numbers A1−An.
It is guaranteed that there exists at least one solution. And if there are different solutions, print the lexicographic minimum one.
[align=left]Sample Input[/align]
2
2 3
1 1 1 1
3 3
1 3 3 1
[align=left]Sample Output[/align]
1 2
1 1 1
Hint
In the first sample, $A$ is $[1,2]$. $A$ has four subsets $[],[1],[2],[1,2]$ and the sums of each subset are $0,1,2,3$. So $B=[1,1,1,1]$
题目大意:给你一个n和m下一行输入B数列从B0~Bm,下标为i则Bi的含义为A数列的子集中和为i的子集为Bi个,现在让你还原A数列,并按照字典顺序输出。
解题思路:B0一定为零不用考虑,那我们现在从B1开始遍历遇到Bi不为零的时候比如B1不为零那么在A数列中1的个数就为B1个,假如B1=0,B2不为零那么同理从B2
开始。我们将这Bi个i一个个的拿走每拿走一个就计算一下拿走这一个i后B数列的值为多少,现在这个状态我们视为一种新的状态,再进行一次这个操作,知道把A数列全部拿完为止。就是一步步的将A拿出来,这样也正好是按照的字典顺序。
用这个解释一下样例,3 3 1 3 3 1
B1=3,即3个1(其实现在就是最后的答案了)那么我们拿一个1,拿了这一个1对原数列的影响:1 2 1 0即用Bj=Bj-B[j-i],B1-1=2,B2-B1=1,B3-B2=0.现在我们用答案验证是符合的。这样一次次的拿将A数列中的数拿完。
AC代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int t,n,m; long long 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("%lld",&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"); } return 0; }
相关文章推荐
- HDU6092 Rikka with Subset-01背包dp-2017多校联盟5 第8题
- HDU6092-Rikka with Subset
- 【2017多校】HDU6092 Rikka with Subset 【DP】
- HDU6092-2017多校5&&背包&贪心-Rikka with Subset
- hdu6092 Rikka with Subset (反向背包)
- HDU6092 Rikka with Subset[母函数]
- 2017 Multi-University Training Contest - Team 5-1008 & hdu6092、Rikka with Subset
- HDU6092 Rikka with Subset【DP】
- hdu6092 Rikka with Subset
- 动态规划 - HDU6092 Rikka with Subset
- HDU6092-Rikka with Subset
- hdu 6092 Rikka with Subset
- hdu 6092 Rikka with Subset【01背包+思维】
- 2017 Multi-University Training Contest - Team 5 1008 Rikka with Subset
- HDU 6092 Rikka with Subset
- 【多校训练】 hdu 6092 Rikka with Subset
- HDU 5829 16多校08 Rikka with Subset (NTT)
- hdu 6092 Rikka with Subset
- HDU 6092 Rikka with Subset (2017多校5-背包)
- Rikka with Subset HDU - 6092