论文里已经写的很清楚了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=26;
const int maxc=1000+5;
const int inf=100000000;
struct edge{
int u,v,dist;
}edges[maxc];
int cnt;
int r[maxc],num[maxc],d[maxc];
void addedge(int u,int v,int dist){
edges[cnt].u=u;
edges[cnt].v=v;
edges[cnt++].dist=dist;
}
void buildgraph(int x){
cnt=48;
for(int i=1;i<=16;i++) addedge(i+8,i,-r[i+8]);
for(int i=17;i<=24;i++) addedge(i-16,i,x-r[i-16]);
addedge(24,0,-x);
}
int bellmanford(){
for(int i=0;i<=24;i++) d[i]=inf;
d[0]=0;
for(int i=0;i<=24;i++){
for(int j=0;j<cnt;j++){
if(d[edges[j].u]+edges[j].dist<d[edges[j].v]){
d[edges[j].v]=d[edges[j].u]+edges[j].dist;
}
}
}
for(int i=0;i<cnt;i++){
if(d[edges[i].u]+edges[i].dist<d[edges[i].v]) return 0;
}
return 1;
}
int ans;
void BinSearch(int l,int r){
if(l>r) return ;
int mid=(l+r)/2;
buildgraph(mid);
if(bellmanford()){
ans=mid;
BinSearch(l,mid-1);
}
else BinSearch(mid+1,r);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
memset(num,0,sizeof(num));
for(int i=1;i<=24;i++) scanf("%d",&r[i]);
scanf("%d",&n);
int x;
for(int i=1;i<=n;i++) {scanf("%d",&x);num[x+1]++;}
cnt=0;
for(int i=1;i<=24;i++){
addedge(i-1,i,num[i]);
addedge(i,i-1,0);
}
ans=-1;
BinSearch(0,n);
if(ans==-1) printf("No Solution\n");
else printf("%d\n",ans);
}
return 0;
}