卧薪尝胆,厚积薄发。
USACO4.1 麦香牛块
Date: Sun Sep 09 06:42:23 CST 2018 In Category: NoCategory

Description:

给出 $n$ 个数字,求不能用他们线性表出的最小数字。
$1\le n \le 10$

Solution:

同余系最短路,这个同余系下所不能表出的数就是 $d[i]-a[1]$ 。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
int n;
#define MAXN 11
int a[MAXN];
struct edge
{
int to,nxt,v;
}e[256 * MAXN];
int edgenum = 0;
int lin[256] = {0};
void add(int a,int b,int c)
{
++edgenum;e[edgenum].to = b;e[edgenum].v = c;e[edgenum].nxt = lin[a];lin[a] = edgenum;
return;
}
int d[256];
bool v[256];
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;++i)scanf("%d",&a[i]);
sort(a + 1,a + 1 + n);
for(int i = 2;i <= n;++i)
for(int j = 0;j < a[1];++j)
add(j,(j + a[i]) % a[1],a[i]);
memset(d,0x3f,sizeof(d));
memset(v,false,sizeof(v));
queue<int> q;q.push(0);d[0] = 0;
while(!q.empty())
{
int k = q.front();q.pop();
v[k] = false;
for(int i = lin[k];i != 0;i = e[i].nxt)
{
if(d[e[i].to] > d[k] + e[i].v)
{
d[e[i].to] = d[k] + e[i].v;
if(!v[e[i].to])
{
v[e[i].to] = true;
q.push(e[i].to);
}
}
}
}
int ans = 0;
for(int i = 0;i < a[1];++i)
{
ans = max(ans,d[i] - a[1]);
}
if(ans > 1e9)puts("0");
else cout << ans << endl;
return 0;
}
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡