[spfa] Jzoj P5864 很多序列

Description

 

Input

Output

 

Sample Input

2
4 7

Sample Output

17
 

Data Constraint

题解

  • 考虑建图跑,从每个点的u按边权为x[i]向(u+x[i])%x[1]
  • 跑spfa,答案就是最大取不到的数(最大值-x1)

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <queue>
 4 #include <cstring>
 5 using namespace std;
 6 int n;
 7 long long a[7],visit[1000010],dis[1000010],ans;
 8 queue<int> Q;
 9 int main()
10 {
11     freopen("sequence.in","r",stdin);
12     freopen("sequence.out","w",stdout);
13     scanf("%d",&n);
14     for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
15     if (n==2)
16     {
17         printf("%lld",a[1]*a[2]-a[1]-a[2]);
18         return 0;
19     }
20     memset(dis,-1,sizeof(dis));
21     Q.push(0),visit[0]=1,dis[0]=0;
22     while (!Q.empty())
23     {
24         int u=Q.front(); Q.pop(),visit[u]=0;
25         for (int i=2;i<=n;i++)
26         {
27             long long v=(u+a[i]%a[1])%a[1];
28             if (dis[v]==-1||dis[u]+a[i]<dis[v])
29             {
30                 dis[v]=dis[u]+a[i];
31                 if (!visit[v]) Q.push(v),visit[v]=1;
32             }
33         }
34     }
35     ans=-1;
36     for (int i=1;i<a[1];i++) ans=max(ans,dis[i]);
37     printf("%lld",ans-a[1]);
38 }

猜你喜欢

转载自www.cnblogs.com/Comfortable/p/9649807.html
今日推荐