关键还是列出不等式,但是这个题对于未知数二分了一下可真是太sao了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int maxn1=30;
const int maxn2=1000;
int head[maxn1],ans=1,dis[maxn1],vis[maxn1],cnt[maxn1];
int n,need[maxn1];
struct edge{
int to,v,next;
}e[maxn2];
void add(edge e[],int &ans,int head[],int x,int y,int v){
e[ans].to=y; e[ans].next=head[x]; e[ans].v=v;
head[x]=ans++;
}
void init(){
memset(head,0,sizeof(head));
memset(cnt,0,sizeof(cnt));
ans=1;
}
int spfa(int S,int T){//最长路
for(int i=0;i<=24;i++) dis[i]=-inf,vis[i]=0,cnt[i]=0;
dis[S]=0; vis[S]=1;
cnt[S]=1;
queue<int> q;
q.push(S);
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(dis[y]<dis[x]+e[i].v){
dis[y]=dis[x]+e[i].v;
if(!vis[y]){
q.push(y);
cnt[y]++;
vis[y]=1;
if(cnt[y]>=n) return -1;
}
}
}
}
return dis[T];
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
init();
for(int i=1;i<=24;i++) scanf("%d",&need[i]);
scanf("%d",&n);
for(int i=0,p;i<n;i++){
scanf("%d",&p);
p++;
cnt[p]++;
}
for(int i=1;i<=24;i++){
add(e,ans,head,i,i-1,0);
add(e,ans,head,i-1,i,-cnt[i]);
}
for(int i=8;i<=24;i++){
add(e,ans,head,i,i-8,need[i]);
}
for(int i=1;i<8;i++){
add(e,ans,head,i,i+16,0);
}
add(e,ans,head,0,24,0);
add(e,ans,head,24,0,0);
int flag=false;
for(int i=0;i<=1000;i++){//枚举p[24]
for(int x=1;x<8;x++){
for(int j=head[x];j;j=e[j].next){
int y=e[j].to;
if(y==x+16){
e[j].v=need[x]-i;
}
}
}
for(int j=head[0];j;j=e[j].next){
if(e[j].to==24){
e[j].v=-i;
}
}
for(int j=head[24];j;j=e[j].next){
if(e[j].to==0){
e[j].v=i;
}
}
int ans=spfa(24,0);
if(ans>0){
printf("%d\n",i);
flag=true;
break;
}
}
if(!flag) printf("No Solution\n");
}
return 0;
}
hdu1531
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int maxn1=105;
const int maxn2=1000;
int head[maxn1],ans=1,dis[maxn1],vis[maxn1],cnt[maxn1];
int n,m,visited[maxn1];
bool bl[maxn1],flag=true;
char s[5];
struct edge{
int to,v,next;
}e[maxn2];
void add(edge e[],int &ans,int head[],int x,int y,int v){
e[ans].to=y; e[ans].next=head[x]; e[ans].v=v;
head[x]=ans++;
}
void init(){
memset(bl,0,sizeof(bl));
memset(head,0,sizeof(head));
memset(visited,0,sizeof(visited));
ans=1;
flag=true;
}
void spfa(){
for(int i=0;i<=n;i++) dis[i]=0,vis[i]=1,cnt[i]=1;
queue<int> q;
for(int i=n;i>=0;i--) q.push(i);
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
visited[y]=1;
if(dis[y]>dis[x]+e[i].v){//最短路
dis[y]=dis[x]+e[i].v;
if(!vis[y]){
q.push(y);
cnt[y]++;
vis[y]=1;
if(cnt[y]>=n+1){
flag=false;
printf("successful conspiracy\n");
return;
}
}
}
}
}
printf("lamentable kingdom\n");
}
int main()
{
while(~scanf("%d",&n)&&n){
scanf("%d",&m);
init();
for(int i=0,l,r,v;i<m;i++){
scanf("%d%d%s%d",&l,&r,s,&v);
r+=l;
l--;
bl[l]=bl[r]=1;
if('g'==s[0]){
add(e,ans,head,l,r,-(v+1));
}else{
add(e,ans,head,r,l,v-1);
}
}
spfa();
}
return 0;
}