题解:CF788C The Great Mixing
在
平均数不好处理,总和好处理啊!平均数和总和之间唯一好做转换的数字就是
然后考虑到
是一个好像是背包 dp 的东西。但是我们怎么辨别是无解,还是有解但是解很大呢?很显然,当所有值都是正/负的时候是无解的。如果不是,那么选出一正一负两个数字
同时可以得到,解是
得到的数字可能是
这时候就需要用到一个 trick:如果 DP 的结果是
但是,怎么转移?要知道我们这里的值有正有负,怎么转移呢?这个图貌似都不是一个 DAG。
我们之前说过了解是
能不能进一步优化?实际上只需要使用
由于
:::success[代码&提交记录]
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int fffff[2010];
bool flaggggg[2010];
int a[1005];
int main()
{
memset(fffff, 0x3f, sizeof fffff);
int *f = fffff + 1005;
bool *flag = flaggggg + 1005;
int n, k;
scanf("%d%d", &n, &k);
for(int i=1;i<=k;i++)
{
int x;
scanf("%d", &x);
flag[x - n] = true;
}
int cur = 0;
for(int i=-1001;i<=1001;i++)
{
if(flag[i]) a[++cur] = i;
}
k = cur;
queue<int> q;
for(int i=1;i<=k;i++)
{
q.push(a[i]);
f[a[i]] = 1;
}
while(!q.empty())
{
int u = q.front();
q.pop();
if(u == 0)
{
printf("%d\n", f[u]);
return 0;
}
for(int i=1;i<=n;i++)
{
if(u + a[i] >= -1001 && u + a[i] <= 1001)
{
if(f[u] + 1 < f[u+a[i]])
{
f[u+a[i]] = f[u] + 1;
q.push(u + a[i]);
}
}
}
}
printf("-1\n");
return 0;
}
sub。 :::