zoukankan      html  css  js  c++  java
  • codevs4439 YJQ Requires Food


    题目描述 Description

    神犇YJQ有n个不同的妹子和m种食物,每一天每一种食物只供应一个妹子吃的份量。在接下来的t天内,YJQ准备包养所有的妹子。 对于每个妹子,她在t天内都只会吃某些特定的食物,并且总共有q种特殊要求,每种要求是在Ti天Ai号妹子会由于特殊原因不能吃第Fi种食物。 有些时候,为了满足妹子的要求,必须改变所有妹子的喂食方案。在每一天重新分配食物会有不同的代价,YJQ不愿意付那么多钱,所以他希望改变妹子喂食方案的代价尽量少。 现在,YJQ拜托你给他的妹子制定食物分配计划,他希望在保证每个妹子每天都有食物吃的前提下,使得改变分配方案付出的代价尽量少。请求出这个最少代价。 如果YJQ无论怎么分配都无法在天内包养所有妹子(包养所有妹子即是使所有妹子在∀i(1<=i<=t)天都有食物),请输出“-1”。

    注:第一天初始分配食物并不需要花费

    输入描述 Input Description

    第一行4个整数n,m,t,q表示YJQ的妹子个数,食物种类数,天数,和特殊要求数; 接下来一行有t个整数表示每一天修改食物方案的代价; 接下来n行,每行m个数,第i行第j列表示第i个妹子是否可以吃第j种食物(1表示可以,0表示不行); 接下来q行,每行3个整数Ti,Ai,Fi表示第Ti天Ai号妹子不能吃食物Fi

    输出描述 Output Description

    一个整数表示YJQ的最小花费,如果无论如何都不能包养所有妹子,输出-1

    样例输入 Sample Input

    3 3 3 2 2 3 3 1 1 0 0 1 1 1 0 1 1 1 1 2 2 3

    样例输出 Sample Output

    3

    数据范围及提示 Data Size & Hint

    对于30%的数据,n,m,t,q<4 ;

    对于50%的数据,t<20 ;

    对于100%的数据,n,m<100,t<500,q<10^4,所有给出的数据都是非负整数(友情提示,YJQ可能没有妹子)

    对于每个i 向后找最远的j 满足i~j天数中的不能满足的边都删掉后做二分图匹配,可以全部点都匹配 记r[i]=j
    
    且r[i]具有单调性,一定>=r[i-1]+1
    
    如果r[i]=i不能满足 就无解
    
    r[i]=j即,在i天更换方案后,到j天都不用再更换,
    
    最后做dp得解(PS.第1天的代价为0
    
    
    
    #include <cstdio><o:p></o:p>
    
    #include <algorithm><o:p></o:p>
    
    #define N 505<o:p></o:p>
    
     
    
    const int INF=1000000009;<o:p></o:p>
    
     
    
    struct fff{int t,a,f;}s[N*N];<o:p></o:p>
    
     
    
    int n,m,d,qe;<o:p></o:p>
    
    int c[N],f[N][N],vis[N],p[N],q[N][N],l[N],r[N],k[N],fir[N];<o:p></o:p>
    
     
    
    bool cmp(const fff&x,const fff&y){return x.t<y.t;}<o:p></o:p>
    
     
    
    int min(int x,int y){return x>y?y:x;}<o:p></o:p>
    
     
    
    int <st1:place w:st="on"><st1:city w:st="on">gary</st1:city></st1:place>(int x)<o:p></o:p>
    
    {<o:p></o:p>
    
           for(int i=1;i<=m;i++)<o:p></o:p>
    
           if(f[x][i]>0&&!vis[i]){<o:p></o:p>
    
                  vis[i]=1;<o:p></o:p>
    
                  if(!p[i]||gary(p[i])){<o:p></o:p>
    
                         p[i]=x;<o:p></o:p>
    
                         return 1;<o:p></o:p>
    
                  }<o:p></o:p>
    
           }<o:p></o:p>
    
           return 0;<o:p></o:p>
    
    }<o:p></o:p>
    
     
    
    int main()<o:p></o:p>
    
    {
    
           scanf("%d%d%d%d",&n,&m,&d,&qe);<o:p></o:p>
    
           if(n==0){printf("0");return 0;}<o:p></o:p>
    
           int le,i,j,h,t,ans;<o:p></o:p>
    
           for(i=1;i<=d;i++)scanf("%d",&c[i]);<o:p></o:p>
    
           for(i=1;i<=n;i++)<o:p></o:p>
    
                  for(j=1;j<=m;j++)scanf("%d",&f[i][j]);<o:p></o:p>
    
           for(i=1;i<=qe;i++)scanf("%d%d%d",&s[i].t,&s[i].a,&s[i].f);<o:p></o:p>
    
           std::sort(s+1,s+1+qe,cmp);<o:p></o:p>
    
           for(i=1;i<=qe;i++)<o:p></o:p>
    
                  if(s[i].t!=s[i-1].t)fir[s[i].t]=i;<o:p></o:p>
    
           for(h=1,le=0;h<=d;h++){                    <o:p></o:p>
    
                         if(r[h-1]==d){for(i=h;i<=d;i++)q[h][d]=1;r[h]=d;continue;       }<o:p></o:p>
    
                         for(t=r[h-1]+1;;t++){<o:p></o:p>
    
                                if(t>d){t--;break;}<o:p></o:p>
    
                                for(i=fir[t];i&&i<=qe&&s[i].t==t;i++)f[s[i].a][s[i].f]--;//删边<o:p></o:p>
    
                                for(i=1;i<=m;i++)p[i]=0;<o:p></o:p>
    
                                for(i=1,ans=0;i<=n;i++){<o:p></o:p>
    
                                       for(j=1;j<=m;j++)vis[j]=0;<o:p></o:p>
    
                                       ans+=gary(i);<o:p></o:p>
    
                                }<o:p></o:p>
    
                                if(ans<n){<o:p></o:p>
    
                                       for(i=fir[t];i&&s[i].t==t&&i<=qe;i++)f[s[i].a][s[i].f]++;t--;break;}//复原图<o:p></o:p>
    
                         }<o:p></o:p>
    
                         if(t<h){printf("-1");return 0;}<o:p></o:p>
    
                         for(i=h;i<=t;i++)q[h][i]=1;r[h]=t;<o:p></o:p>
    
                         for(i=fir[h];i&&s[i].t==h&&i<=qe;i++)f[s[i].a][s[i].f]++;// 复原图<o:p></o:p>
    
           }<o:p></o:p>
    
           for(i=1;i<=d;i++){l[i]=INF;q[i][i]=1;}<o:p></o:p>
    
           c[1]=l[1]=0;   <o:p></o:p>
    
           for(i=1;i<=d;i++)<o:p></o:p>
    
           for(j=i;j<=d;j++)<o:p></o:p>
    
           if(q[i][j])l[j]=min(l[j],l[i-1]+c[i]);<o:p></o:p>
    
           printf("%d",l[d]);<o:p></o:p>
    
           return 0;<o:p></o:p>
    
    }
  • 相关阅读:
    Html禁止粘贴 复制 剪切
    表单标签
    自构BeanHandler(用BeansUtils)
    spring配置中引入properties
    How Subcontracting Cockpit ME2ON creates SD delivery?
    cascadia code一款很好看的微软字体
    How condition value calculated in sap
    Code in SAP query
    SO Pricing not updated for partial billing items
    Javascript learning
  • 原文地址:https://www.cnblogs.com/hyfer/p/5852402.html
Copyright © 2011-2022 走看看