您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: