zoukankan      html  css  js  c++  java
  • BZOJ3280: 小R的烦恼

    题解:

    随便建一下图费用流就可以过吧。。。

    代码:

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<cmath>
      4 #include<cstring>
      5 #include<algorithm>
      6 #include<iostream>
      7 #include<vector>
      8 #include<map>
      9 #include<set>
     10 #include<queue>
     11 #include<string>
     12 #define inf 1000000000
     13 #define maxn 100000+5
     14 #define maxm 100000+5
     15 #define eps 1e-10
     16 #define ll long long
     17 #define pa pair<int,int>
     18 #define for0(i,n) for(int i=0;i<=(n);i++)
     19 #define for1(i,n) for(int i=1;i<=(n);i++)
     20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
     21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
     22 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
     23 #define mod 1000000007
     24 using namespace std;
     25 inline int read()
     26 {
     27     int x=0,f=1;char ch=getchar();
     28     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     29     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
     30     return x*f;
     31 }
     32 int n,m,k,mincost,maxflow,tot=1,s,ss,t,sum,a[maxn],head[maxn],d[maxn],from[2*maxm];
     33 bool v[maxn];
     34 queue<int>q;
     35 struct edge{int from,go,next,v,c;}e[2*maxm];
     36 void add(int x,int y,int z,int w)
     37 {
     38     e[++tot]=(edge){x,y,head[x],z,w};head[x]=tot;
     39     e[++tot]=(edge){y,x,head[y],0,-w};head[y]=tot;
     40 }
     41 bool spfa()
     42 {
     43     for (int i=s;i<=t;i++){v[i]=0;d[i]=inf;}
     44     q.push(s);d[s]=0;v[s]=1;
     45     while(!q.empty())
     46     {
     47         int x=q.front();q.pop();v[x]=0;
     48         for (int i=head[x],y;i;i=e[i].next)
     49          if(e[i].v&&d[x]+e[i].c<d[y=e[i].go])
     50          {
     51             d[y]=d[x]+e[i].c;from[y]=i;
     52             if(!v[y]){v[y]=1;q.push(y);}
     53          }
     54     }
     55     return d[t]!=inf;
     56 }
     57 void mcf()
     58 {
     59     mincost=0;maxflow=0;
     60     while(spfa())
     61     {
     62         int tmp=inf;
     63         for(int i=from[t];i;i=from[e[i].from]) tmp=min(tmp,e[i].v);
     64         mincost+=d[t]*tmp;maxflow+=tmp;
     65         for(int i=from[t];i;i=from[e[i].from]){e[i].v-=tmp;e[i^1].v+=tmp;}
     66     }
     67 }
     68 int main()
     69 {
     70     freopen("input.txt","r",stdin);
     71     freopen("output.txt","w",stdout);
     72     int T=read(),cs=0;
     73     while(T--)
     74     {
     75         n=read();m=read();k=read();sum=0;
     76         s=0;ss=2*n+1;t=ss+1;
     77         memset(head,0,sizeof(head));tot=1;
     78         for1(i,n)
     79         {
     80             a[i]=read();sum+=a[i];
     81             add(s,i,a[i],0);
     82             add(i+n,t,a[i],0);
     83         }
     84         for1(i,n-1)add(i,i+1,inf,0);
     85         for1(i,m)
     86         {
     87             int x=read(),y=read();
     88             add(s,ss,x,y);
     89         }
     90         for1(i,n)add(ss,i+n,inf,0);
     91         for1(i,k)
     92         {
     93             int x=read(),y=read();
     94             for1(j,n-x-1)add(j,j+x+1+n,inf,y);
     95         }
     96         mcf();
     97         printf("Case %d: ",++cs);
     98         if(maxflow!=sum)printf("impossible
    ");else printf("%d
    ",mincost);
     99     }
    100                 
    101     return 0;
    102 }
    View Code

    3280: 小R的烦恼

    Time Limit: 10 Sec  Memory Limit: 512 MB
    Submit: 138  Solved: 62
    [Submit][Status]

    Description

    小R最近遇上了大麻烦,他的程序设计挂科了。于是他只好找程设老师求情。善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题。
    问题是这样的,程设老师最近要进行一项邪恶的实验来证明P=NP,这个实验一共持续n天,第i天需要a[i]个研究生来给他搬砖。研究生毕竟也是人,所以雇佣研究生是需要钱的,机智的程设老师已经联系好了m所大学,第j所大学共有l[j]个研究生,同时雇佣这所大学的一个研究生需要p[j]元钱。
    本来程设老师满心欢喜的以为,这样捡最便宜的max{a[i]}个研究生雇来,就可以完成实验;结果没想到,由于他要求硕士生们每天工作25个小时不许吃饭睡觉上厕所喝水说话咳嗽打喷嚏呼吸空气,因此一天下来给他搬砖的所有研究生都会进入濒死状态。濒死状态的研究生,毫无疑问,就不能再进行工作了。但是机智的老师早早联系好了k家医院,第i家医院医治一个濒死的研究生需要d[i]天,并且需要q[i]元钱。

    现在,程设老师想要知道,最少花多少钱,能够在这n天中满足每天的需要呢?若无法满足,则请输出”impossible”。注意,由于程设老师良心大大的坏,所以他是可以不把濒死的研究生送去医院的!

    
    
     

    Input

           本题包含多组数据;第一行是一个数T(T<=11),表示数据组数,以下T组数据。
    对于每一组数据,第一行三个数,n,m,k;
    以下一行n个数,表示a[1]…a[n]
    接着一行2m个数,表示l[1],p[1]…l[n],p[n]
    接着一行2k个数,表示d[1],q[1]…d[n],q[n]

    Output

           对于每组数据以样例的格式输出一行,两个数分别表示第几组数据和最少钱数。

    Sample Input

    2
    3 2 1
    10 20 30
    40 90 15 100
    1 5
    3 2 1
    10 20 30
    40 90 15 100
    2 5

    Sample Output

    Case 1: 4650
    Case 2: impossible

    HINT

    样例解释:买下90块钱的那40个研究生,另外再买10个100块钱的。这样,第一天用完的10个人全部送到医院,那么他们在第三天可以继续使用;同时,第二天和第三天都用新的研究生来弥补,这样一共需要花费40*90 + 10*100 + 5*10 = 4650元。

    数据规模:

    对于30%的数据中的每组数据,

    满足n<=5,m,k<=2,其余数均小于等于100或者 

    n<=10,m,k<=10,其余数均小于等于20.

    对于100%的数据

    n,m,k<=50,其余数均小于等于100.

    Source

  • 相关阅读:
    春招实习_oppo一面 4.8 (40min)
    春招实习_腾讯突击面试 3.31
    github使用
    手把手教你用SonarQube+Jenkins搭建--前端项目--代码质量管理平台 (Window系统)
    博客园右下角添加看板娘
    微信公众号接个图灵机器人
    [转]HTML5基本布局
    微信群二维码怎么长期有效,微信群二维码记久有效,微信群二维码过期失效了
    Redis查看当前连接数和最大连接数
    删除表前判断表是否存在SQL
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4189794.html
Copyright © 2011-2022 走看看