zoukankan      html  css  js  c++  java
  • Steady Cow Assignment

    poj3189:http://poj.org/problem?id=3189

    题意:这一题的题意。我看了很长时间才弄懂。就是给你n头牛,m个牛棚,每个牛对每一个牛棚会有一个满值,第i行第j个数表示的是第i头牛满意度为j的是牛棚mp[i][j],而且牛棚会有一定的容量。然后把牛分配到相应的牛棚,使得最大的满意度和最小的满意度之间的差值最小。

    题解:由于,满意度的范围很小,所以就自然想到用枚举区间的办法,枚举满意度,但是如果没有优化的话,是会T的,我加了一个二分以及其他的优化,跑了300多点,

      1 #include<iostream>
      2 #include<cstring>
      3 #include<algorithm>
      4 #include<cstdio>
      5 #include<queue>
      6 #define INF 100000000
      7 using namespace std;
      8 const int N=1105;
      9 const int M=1000000;
     10 struct Node{
     11    int v;
     12    int f;
     13    int next;
     14 }edge[M];
     15 int n,m,u,v,cnt,sx,ex;
     16 int head[N],pre[N];
     17 int val[N][40],val1[N];//根据题目要求申请
     18 void init(){
     19     cnt=0;
     20     memset(head,-1,sizeof(head));
     21 }
     22 void add(int u,int v,int w){
     23     edge[cnt].v=v;
     24     edge[cnt].f=w;
     25     edge[cnt].next=head[u];
     26     head[u]=cnt++;
     27     edge[cnt].f=0;
     28     edge[cnt].v=u;
     29     edge[cnt].next=head[v];
     30     head[v]=cnt++;
     31 }
     32 bool BFS(){
     33   memset(pre,0,sizeof(pre));
     34   pre[sx]=1;
     35   queue<int>Q;
     36   Q.push(sx);
     37  while(!Q.empty()){
     38      int d=Q.front();
     39      Q.pop();
     40      for(int i=head[d];i!=-1;i=edge[i].next    ){
     41         if(edge[i].f&&!pre[edge[i].v]){
     42             pre[edge[i].v]=pre[d]+1;
     43             Q.push(edge[i].v);
     44         }
     45      }
     46   }
     47  return pre[ex]>0;
     48 }
     49 int dinic(int flow,int ps){
     50     int f=flow;
     51      if(ps==ex)return f;
     52      for(int i=head[ps];i!=-1;i=edge[i].next){
     53         if(edge[i].f&&pre[edge[i].v]==pre[ps]+1){
     54             int a=edge[i].f;
     55             int t=dinic(min(a,flow),edge[i].v);
     56               edge[i].f-=t;
     57               edge[i^1].f+=t;
     58              flow-=t;
     59              if(flow<=0)break;
     60         }
     61 
     62      }
     63       if(f-flow<=0)pre[ps]=-1;
     64       return f-flow;
     65 }
     66 int solve(){
     67     int sum=0;
     68     while(BFS())
     69         sum+=dinic(INF,sx);
     70     return sum;
     71 }
     72 int main(){
     73     int ans,temp;
     74     while(~scanf("%d%d",&n,&m)) {
     75          init();
     76          ans=INF;sx=0,ex=n+m+1;
     77        for(int i=1;i<=n;i++)
     78         for(int j=1;j<=m;j++){
     79             scanf("%d",&temp);
     80             val[i][temp]=j;
     81         }
     82         for(int i=1;i<=m;i++)
     83           scanf("%d",&val1[i]);
     84     for(int i=1;i<=m;i++){
     85         int l=i,r=m;
     86         while(l<=r){
     87             int mid=(l+r)/2;
     88             if(mid-i>=ans){
     89                 r=mid-1;
     90                 continue;
     91             }
     92              init();
     93             for(int k=1;k<=n;k++)
     94                 add(0,k,1);
     95             for(int k=1;k<=n;k++)
     96             for(int h=1;h<=m;h++)
     97             if(val[k][h]<=mid&&val[k][h]>=i)
     98               add(k,n+h,1);
     99             for(int k=1;k<=m;k++)
    100                 add(k+n,n+m+1,val1[k]);
    101             if(solve()==n){
    102                ans=min(ans,mid-i);
    103                 r=mid-1;
    104             }
    105             else
    106                 l=mid+1;
    107          }
    108       }
    109       printf("%d
    ",ans+1);
    110     }
    111       return 0;
    112 }
    View Code
  • 相关阅读:
    CentOS 7源码安装zabbix
    CentOS 7 yum安装Zabbix
    Centos 7配置LAMP
    Oracle 12c RMAN备份文档
    Oracle 12c: RMAN restore/recover pluggable database
    Oracle 12c利用数据泵DataPump进行Oracle数据库备份
    EBS测试环境DataGuard配置
    oracle数据库将一列的值拼接成一行,并且各个值之间用逗号隔开
    ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode
    rman输出日志的几种方法(转)
  • 原文地址:https://www.cnblogs.com/chujian123/p/3941420.html
Copyright © 2011-2022 走看看