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>

}
时间: 2024-10-11 18:27:31

codevs4439 YJQ Requires Food的相关文章

sed: -i requires an argument Permission denied

在脚本中使用sed时,如果一行的内容较长,为了脚本美观要换行,在行尾添加"\"即可. 注意:如果在"\"之后添加空格,例如: sed -i "/^xxx=/s/.*/xxx=$xxx/"\[:space:]        $xxx echo $? [:space:]表示行尾有一个空格 脚本会报如下错误: sed: -i requires an argument./xxx.sh: line 20: xxx.sh: Permission denied

nginx安装报错./configure: error: the http rewrite module requires the pcre library.

nginx编译时报错: ./configure: error: the http rewrite module requires the pcre library. 解决方法: [[email protected] nginx-1.5.9]#  yum install zlib-devel -y

eclipse安装maven插件-解决requires ‘bundle org.slf4j.api 1.6.2′

eclipse安装maven插件-解决requires 'bundle org.slf4j.api 1.6.2′ [转载]http://robin.sh/html/1526_eclipse-maven.html 给eclipse安装maven插件,网上教程已经很多,不在累述.关键是安装过程中报错:requires 'bundle org.slf4j.api 1.6.2' but it could not be found. 这个错误很难搞,网上提供的解决方案绝大部分都不起作用.可能跟eclips

Python pandas &#39;HDFStore requires PyTables&#39; Issue

Python pandas 'HDFStore requires PyTables' Issue 在运行mobike.py过程中,一直报错,原因是pip install tables命令中安装的pytables文件其实是存在问题的,后续有人修正了这个问题并发布了新的tables库 因此在安装的时候 pip install tables==3.3.0 Python pandas 'HDFStore requires PyTables' Issue

Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 10

今天编译一个project,我设置为api 14,可是编译报错: Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4 參考 http://stackoverflow.com/questions/22552199/unable-to-build-android-project-using-facebook-sdk-against-android-2-2-froyoUsing 1.7 requir

View requires API level 14 (current min is 8)

<GridLayout        android:columnCount="4"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/gridContainer"        android:animateLayoutChanges="t

This Android SDK requires Android Developer Toolkit version 23.0.0 or above

This Android SDK requires Android Developer Toolkit version 23.0.0 or above. Current version is 12.0.0.v201106281929-138431. Please update ADT to the latest version 22.0.0 一般这种原因是误更新了SDK,导致SDK版本过高,ECLIPSE提示需要更新ADT. 解决办法如下: 找到android-sdk-windows\tools

Android 开发之错误整理java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10088 nor current process has android.permission.READ_PHONE_STATE.

java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10088 nor current process has android.permission.READ_PHONE_STATE. 今天写了一款发短信的软件,拿了个酷派5879,试了下,结果不能用,把try{}catch{}去掉了,报这个错误, android.permission.READ_PHONE_STATE.没有READ_PHONE_STATE权限,

Eclipse--Maven--Dynamic Web Module 3.0 requires Java 1.6 错误

用Eclipse创建Maven webapp项目时报错Dynamic Web Module 3.0 requires Java 1.6 错误 其实这个问题就是两者不匹配的问题Dynamic Web Module 和JDK 版本不匹配,具体问题看problems 两种方法解决, (1)上面Java 是1.4的,按向下三角形换用低版本的Dynamic Web Module,我试了一下,换成2.4以下就可以啦 (2)也可以根据Dynamic Web Module3.0为匹配对象,更换Java为1.6及