很好的题目。

有不多于200个任务,每个任务要在si到ei这个时间段内完成,每个任务的任务量是ti*ni,只有一台机器,且其单位时间内可完成的任务量为m。

现在问你,能否使所有的任务全部在规定的时间段内完成。

首先把所有的时间都提取出来,排序,得到2*n-1个时间区间。

网络流建模。首先创建一个超级源点和超级汇点。源点连接n个任务,与每个任务的边的容量为ni*ti,汇点连接2*n-1个时间区间,容量为时间长度与m的乘积。同时在任务和时间区间之间也需要连边,如果某个任务的时间和时间区间有公共时间段,那么他们之间连一条边,边容量为公共时间长度乘以m。这样我们只需要求整个网络的最大流,看看是否与总的工作量相等即可。

很有意思。嘿嘿

召唤代码君:

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
#define maxn 777
#define Inf ~0U>>1
using namespace std; int c[maxn][maxn],d[maxn],can[maxn];
int n,m,s,t,tot,ans;
int ni[maxn],ti[maxn],si[maxn],ei[maxn];
int T[maxn],N;
vector<int> v[maxn]; void _init()
{
s=1,t=1+3*n,N=0,ans=tot=0;
for (int i=1; i<=1+3*n; i++)
{
v[i].clear();
for (int j=1; j<=1+3*n; j++) c[i][j]=0;
}
} void graph_build()
{
int L,R;
sort(T+1,T+1+2*n);
for (int i=1; i<=n; i++)
{
c[1][i+1]=ni[i]*ti[i];
v[1].push_back(i+1),v[i+1].push_back(1);
}
for (int i=1; i<2*n; i++)
{
c[n+1+i][3*n+1]=(T[i+1]-T[i])*m;
v[n+1+i].push_back(3*n+1),v[3*n+1].push_back(n+1+i);
}
for (int i=1; i<=n; i++)
for (int j=1; j<2*n; j++)
{
L=max(si[i],T[j]);
R=min(ei[i],T[j+1]);
if (L>=R) continue;
c[1+i][n+1+j]=(R-L)*m;
v[1+i].push_back(n+1+j),v[n+1+j].push_back(1+i);
}
} void bfs()
{
for (int i=s; i<=t; i++) d[i]=999999,can[i]=0;
queue<int> Q;
Q.push(t);
d[t]=0;
while (!Q.empty())
{
int cur=Q.front();
Q.pop();
for (unsigned i=0; i<v[cur].size(); i++)
{
if (c[v[cur][i]][cur]<=0) continue;
if (d[cur]+1<d[v[cur][i]])
{
d[v[cur][i]]=d[cur]+1;
Q.push(v[cur][i]);
}
}
}
} int dfs(int cur,int num)
{
if (cur==t) return num;
int k,tmp=num;
for (unsigned i=0; i<v[cur].size(); i++)
{
if (c[cur][v[cur][i]]<=0 || d[v[cur][i]]+1!=d[cur] || can[v[cur][i]]) continue;
k=dfs(v[cur][i],min(num,c[cur][v[cur][i]]));
if (k) c[cur][v[cur][i]]-=k,c[v[cur][i]][cur]+=k,num-=k;
}
if (num) can[cur]=1;
return tmp-num;
} int Dinic()
{
for (bfs(); d[s]<3*n+1; bfs()) ans+=dfs(1,Inf);
return ans;
} int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
_init();
for (int i=1; i<=n; i++)
{
scanf("%d%d%d%d",&si[i],&ni[i],&ei[i],&ti[i]);
tot+=ni[i]*ti[i];
T[++N]=si[i],T[++N]=ei[i];
}
graph_build();
if (Dinic()==tot) puts("Yes");
else puts("No");
}
return 0;
}

  

HDU2883_kebab的更多相关文章

随机推荐

  1. 菜鸟vimer成长记——目录

    菜鸟vimer成长记——第0章.我眼中的vim学习 菜鸟vimer成长记——第1章.统一概念 菜鸟vimer成长记——第2.0章.模式初探 菜鸟vimer成长记——第2.1章.normal模式 菜鸟v ...

  2. JavaScript快速查找节点

    我们在实际的开发中,经常要获取页面中某个html元素,动态更新元素的样式.内容属性等. 我们已经知道在JavaScript中提供下面的方法获取子.父.兄节点的方法: 常规 通过父节点获取子节点: pa ...

  3. python容器类型的协议

    1.协议(Protocols)与其他编程语言中的接口恒相似,它规定你哪些地方必须要定义,然而在python中的协议就显得不那么正式,事实上,在python中,协议更像是一种指南. 2.序列类型和映射类 ...

  4. 表格 - bootStrap4常用CSS笔记

    [表格标签]   <table> 定义一个表格 <thead> 表格表头 <tbody> 表格主体内容 <tr> 行 <th> 表头列 &l ...

  5. Python 夺大满贯!三大编程语言榜即将全部“失守”!

    有互联网创业者说: 2019年可能会是过去十年里最差的一年 但却是未来十年里最好的一年 真的是这样吗? “每月工资1w,如何赚到200w?” 同样一个问题,问不同的人会得到不同的答案. 有一类人,开始 ...

  6. linux执行命令返回码释义

    Linux 操作系统错误代码解释 0.错误代码1-10 OS error code 0: Success 操作系统错误代码0:成功 OS error code 1: Operation not per ...

  7. shell小记

    1.以#!/bin/bash 开头2.执行方式 bash sh ./ `script`3.变量: 系统变量  自定义变量  --->export 可导出为全局环境变量        set显示所 ...

  8. linux下自己安装软件做成命令

    安装nodejs,从官网下下来的是一个压缩包,解压下里面有可执行文件.教程上用ln -s [可执行文件的绝对路径] [/usr/local/bin/]建了一个软连接,这样就能直接无视路径,用命令行调用 ...

  9. (第十一周)约跑APP测试报告

    项目名称:约跑App 用户需求规格说明书URL:http://www.cnblogs.com/liquan/p/6071804.html 组长博客URL:http://www.cnblogs.com/ ...

  10. Go Going软件需求规格说明书

    1.目标是什么,目标不包括什么? 我们软件的目标是让大学生走出校园,用最小的花费到更多的地方去,开阔视野,读万卷书再行万里路. 目标暂且不包括外校学生 2.用户和典型场景是什么? 用户:在校大学生 典 ...