1 条题解
-
0

// 同余最短路 SPFA 算法 O(nm) #include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+5,M=5e6+5; ll idx,h[N],to[M],ww[M],ne[M]; void add(ll u,ll v,ll w){ to[++idx]=v;ww[idx]=w;ne[idx]=h[u];h[u]=idx; } ll n,q,v1,c1,V,v[55],c[55],d[N]; bool vis[N]; void SPFA(){ for(int i=0; i<=v1; i++) d[i]=-1e18; d[0]=0; queue<ll> q; q.push(0); while(!q.empty()){ ll u=q.front(); q.pop(); vis[u]=false; for(int i=h[u]; i; i=ne[i]){ ll v=to[i],w=ww[i]; if(d[v]<d[u]+w){ d[v]=d[u]+w; if(!vis[v]) q.push(v),vis[v]=true; } } } } int main(){ scanf("%lld%lld",&n,&q); v1=1,c1=0; for(int i=1; i<=n; i++){ scanf("%lld%lld",&v[i],&c[i]); //体积,价值 if(c[i]*v1>v[i]*c1) v1=v[i],c1=c[i]; //找出性价比c/v最大的 } for(int i=0; i<v1; i++)for(int j=1; j<=n; j++){ add(i,(i+v[j])%v1,c[j]-(i+v[j])/v1*c1); } SPFA(); for(int i=1; i<=q; i++){ scanf("%lld",&V); if(d[V%v1]==-1e18) puts("-1"); else printf("%lld\n",V/v1*c1+d[V%v1]); } }
- 1
信息
- ID
- 7371
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 2
- 上传者