• hdu_5855_Less Time, More profit(二分+最大权闭合图)


    题目链接:hdu_5855_Less Time, More profit

    题意:

    有n个工厂,每建一个工厂要花费vi,需要时间ti,然后有m个商店,每个商店需要在指定的k个工厂中进货,才能盈利,如果其中一个不在,都不能盈利,问在满足利润大于等于k的情况下的最少时间t,和在t时刻的最大利润

    题解:

    二分时间+网络流的最大权闭合图。比赛的时候搞了半天的题意才看懂,4点过才开始写网络流,然而没时间调试了。然后就GG了

     1 #include<bits/stdc++.h>
     2 #define mst(a,b) memset(a,b,sizeof(a));
     3 #define F(i,a,b) for(int i=a;i<=b;++i)
     4 using namespace std;
     5 
     6 const int N=511,inf=~0U>>2,M=401000;
     7 struct edge{int t,f;edge*nxt,*pair;}*g[N],*d[N],pool[M],*cur=pool;
     8 struct ISAP{
     9     int n,m,i,S,T,h[N],gap[N],maxflow;
    10     void init(int ss,int tt){for(S=ss,T=tt,cur=pool,i=1;i<=T;i++)g[i]=d[i]=NULL,h[i]=gap[i]=0;}
    11     void add(int s,int t,int f){
    12         edge*p=cur++;p->t=t,p->f=f,p->nxt=g[s],g[s]=p;
    13         p=cur++,p->t=s,p->f=0,p->nxt=g[t],g[t]=p;
    14         g[s]->pair=g[t],g[t]->pair=g[s];
    15     }
    16     int sap(int v,int flow){
    17         if(v==T)return flow;
    18         int rec=0;
    19         for(edge*p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&p->f){
    20         int ret=sap(p->t,min(flow-rec,p->f));
    21         p->f-=ret;p->pair->f+=ret;d[v]=p;
    22         if((rec+=ret)==flow)return flow;
    23         }
    24         if(!(--gap[h[v]]))h[S]=T;
    25         gap[++h[v]]++;d[v]=g[v];
    26         return rec;
    27     }
    28     int get_ans(){
    29         for(gap[maxflow=0]=T,i=1;i<=T;i++)d[i]=g[i];
    30         while(h[S]<T)maxflow+=sap(S,inf);
    31         return maxflow;
    32     }
    33 }G;
    34 
    35 int t,n,m,l,L,R,ansf,ic=1,all;
    36 struct pat{
    37     int v,t;
    38 }pt[201];
    39 struct shop{
    40     int v,k,vis[201];
    41 }sp[201];
    42 
    43 
    44 bool check(int x)
    45 {
    46     all=0;
    47     G.init(1,405);
    48     F(i,1,n)if(pt[i].t<=x)G.add(i+201,405,pt[i].v);
    49     int vv[201];
    50     mst(vv,0);
    51     F(i,1,m)
    52     {
    53         int fg=1;
    54         F(j,1,sp[i].k)
    55         if(pt[sp[i].vis[j]].t>x)fg=0;
    56         if(fg)vv[i]=1;
    57     }
    58     F(i,1,m)if(vv[i])G.add(1,i+1,sp[i].v);
    59     F(i,1,m)if(vv[i])
    60     {
    61         all+=sp[i].v;
    62         F(j,1,sp[i].k)G.add(i+1,sp[i].vis[j]+201,inf);
    63     }
    64     ansf=all-G.get_ans();
    65     if(ansf>=l)return 1;
    66     else return 0;
    67 }
    68 
    69 int main(){
    70     scanf("%d",&t);
    71     while(t--)
    72     {
    73         ansf=0,all=0;
    74         L=1e9,R=0;
    75         scanf("%d%d%d",&n,&m,&l);
    76         F(i,1,n)scanf("%d%d",&pt[i].v,&pt[i].t),L=min(L,pt[i].t),R=max(R,pt[i].t);
    77         F(i,1,m)
    78         {
    79             scanf("%d%d",&sp[i].v,&sp[i].k);
    80             F(j,1,sp[i].k)scanf("%d",&sp[i].vis[j]);
    81         }
    82         int mid,ans=0;
    83         while(L<=R)
    84         {
    85             mid=(L+R)>>1;
    86             if(check(mid))R=(ans=mid)-1;
    87             else L=mid+1;
    88         }
    89         check(ans);
    90         if(ansf>=l)printf("Case #%d: %d %d
    ",ic++,ans,ansf);
    91         else printf("Case #%d: impossible
    ",ic++);
    92     }
    93 }
    View Code
  • 相关阅读:
    Python小工具:统计代码行数
    计算机图形学复习(一)
    牛客多校训练第一场 J.Different Integers
    数据校验码概述
    数据库复习第二章
    数据库复习第一章
    自动化AC器(带界面版)
    ZOJ 3747 Attack on Titans
    Codeforces Round #245 (Div. 1) B. Working out
    HDU 6266 Hakase and Nano 【博弈论】
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5777348.html
Copyright © 2020-2023  润新知