BZOJ 3280: 小R的烦恼
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]
n,m,k<=50,其余数均小于等于100.
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
样例解释:
买下90块钱的那40个研究生,另外再买10个100块钱的。这样,第一天用完的10个人全部送到医院,那么他们在第
三天可以继续使用;同时,第二天和第三天都用新的研究生来弥补,这样一共需要花费4090 + 10100 + 5*10 =
4650元。
题解
将每一天拆点,拆成活着的和死了的。
从S向每个大学连边\((l[i] , p[i])\)
每个大学向每天活着的连\((inf , 0)\) 的边。
第i天会死去\(a[i]\) 个人,从S向每一天死去的人连\((a[i] , 0)\) 的边
活着的人向T连\((a[i] , 0)\) 的边。
死去的人可以留着明天再救\((inf , 0)\) 也可以现在救\((inf , q[i])\) 注意是连向i+d天。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
const int N = 666 , inf = 1e8;
inline int read()
{
register int x = 0 , f = 0; register char c = getchar();
while(c < '0' || c > '9') f |= c == '-' , c = getchar();
while(c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0' , c = getchar();
return f ? -x : x;
}
int n , m , k , S , T , cnt = 1;
int a[N] , p[N] , c[N] , d[N] , q[N] , head[N] , f[N] , dis[N] , pre[N] , vis[N];
struct edge{ int v , nex , c , val; } e[N*N*10];
inline void add(int u , int v , int c , int val)
{
e[++cnt].v = v; e[cnt].nex = head[u]; e[cnt].c = c; e[cnt].val = val; head[u] = cnt;
e[++cnt].v = u; e[cnt].nex = head[v]; e[cnt].c = 0; e[cnt].val = -val; head[v] = cnt;
return ;
}
queue<int> Q;
bool spfa()
{
for(int i = 1 ; i <= T ; ++i) dis[i] = inf , pre[i] = 0; f[S] = inf; dis[S] = 0; Q.push(S);
while(Q.size())
{
int x = Q.front(); Q.pop(); vis[x] = 0;
for(int i = head[x] , v; i ; i = e[i].nex)
{
v = e[i].v;
if(e[i].c && dis[v] > dis[x] + e[i].val)
{
dis[v] = dis[x] + e[i].val; f[v] = min(f[x] , e[i].c);
pre[v] = i; if(!vis[v]) vis[v] = 1 , Q.push(v);
}
}
}
return dis[T] != inf;
}
int calc(int &flow)
{
int ans = 0; flow = 0;
while(spfa())
{
ans += f[T] * dis[T]; flow += f[T];
for(int t = T , i; t != S ; t = e[i^1].v) i = pre[t] , e[i].c -= f[T] , e[i^1].c += f[T];
}
return ans;
}
void solve(int Case)
{
n = read(); m = read(); k = read(); S = n+n+m+1; T = S+1; int sum = 0 , x , y;
for(int i = 1 ; i <= T ; ++i) head[i] = 0; cnt = 1;
for(int i = 1 ; i <= n ; ++i) x = read() , add(S , i+n , x , 0) , add(i , T , x , 0) , sum += x;
for(int i = 1 ; i <= m ; ++i) x = read() , y = read() , add(S , i+n+n , x , y);
for(int i = 1 ; i <= m ; ++i) for(int j = 1 ; j <= n ; ++j) add(i+n+n , j , inf , 0);
for(int i = 1 ; i < n ; ++i) add(i+n , i+n+1 , inf , 0);
for(int i = 1 ; i <= k ; ++i)
{
x = read(); y = read();
for(int j = 1 ; j + x < n ; ++j) add(j+n , j+x+1 , inf , y);
}
int flow = 0;
int ans = calc(flow);
printf("Case %d: " , Case);
if(flow != sum) puts("impossible"); else cout << ans << '\n';
}
int main()
{
int T = read();
for(int i = 1 ; i <= T ; ++i) solve(i);
return 0;
}
/*
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
*/
BZOJ 3280: 小R的烦恼的更多相关文章
- BZOJ 3280: 小R的烦恼 & BZOJ 1221: [HNOI2001] 软件开发
3280: 小R的烦恼 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 399 Solved: 200[Submit][Status][Discuss ...
- bzoj 3280: 小R的烦恼 费用流
题目: Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的,程设老师最近要进行一项 ...
- bzoj 3280: 小R的烦恼 (网络流)
和开发计划一样(数组开太小wa了好多次,然后为什么这么慢? type arr=record toward,next,cap,cost:longint; end; const maxm=; maxn=; ...
- 【BZOJ】【3280】小R的烦恼
网络流/费用流 和软件开发那题基本相同,只是多加了一个“雇佣研究生”的限制:不同价格的研究生有不同的数量…… 那么只需加一个附加源点,对每一种研究生连边 S->ss 容量为l[i],费用为p[i ...
- BZOJ3280: 小R的烦恼
题解: 随便建一下图费用流就可以过吧... 代码: #include<cstdio> #include<cstdlib> #include<cmath> #incl ...
- 【BZOJ3280】小R的烦恼 最小费用最大流
[BZOJ3280]小R的烦恼 Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的 ...
- BZOJ_3280_小R的烦恼_最小费用最大流
BZOJ_3280_小R的烦恼_最小费用最大流 Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要 求小R帮助他一起解决一个难 ...
- bzoj3280: 小R的烦恼(最小费用最大流)
Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要 求小R帮助他一起解决一个难题.问题是这样的,程设老师最近要进行一项邪恶的实 ...
- 【bzoj3280】小R的烦恼 费用流
题目描述 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的,程设老师最近要进行一项邪恶的实验来证明P=N ...
随机推荐
- 安装 Cacti 监控
简介: Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具. Cacti是通过 snmpget来获取数据,使用 ...
- JS从键盘输入当月利润,求应发放奖金总数
题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%:20万到4 ...
- 【Web性能权威指南】 PDF
Web性能权威指南.pdf 网盘:https://545c.com/file/24657411-424998805 获取码:276922
- C# MemoryCache学习笔记
很多情况下需要用到缓存,合理利用缓存一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.为了避免每次请求都去访问后台的 资源(例如数据库),一般会考虑将一些更新不是很频繁的.可以重用的数据 ...
- Ansible学习笔记(一):部署管理Windows机器遇到的一些坑
在给国盛通上海测试环境做Ansible管理Windows服务器的时候,遇到了一些坑,Google解决掉了,特此记录,坑用红色标记. 一.环境说明 1.Ansible管理主机 操作系统:CentOS 7 ...
- TampeMonkey 关于 youtube的两个插件
一个是 Video Speed Buttons 负责调速 一个是 YouTube Links 负责下载不同分辨率的视频
- win10下载
Win10 简体中文正式版 微软MSDN官方ISO镜像下载(2020年1月21日更新) 官方地址:https://www.microsoft.com/zh-cn/software-download/w ...
- C语言用两个栈实现队列(完整版)
队列是一种 先进先出(first in - first out, FIFO)的数据结构,队列中的元素都从后端(rear)入队(push),从前端(front)出队(pop).实现队列最直观的方法是用链 ...
- 我眼中的ASP.NET.MVC
MVC MVC全名 : Model View Controller ( Model-模型 View-视图 Controller-控制器)是一种经典的,经久不衰的,屹立不倒的软件设计框架.实现了业务逻 ...
- C# MVC 中自定义权限特性[Authorize]中对于Ajax访问的处理
在MVC中定义自己的权限特性. 下例中是简单的登录判断,登录信息存与Session中,如果Session中没有登录信息,那么就不通过. 在处理无权限的时候,判断当前请求是否为Ajax请求,如果是Aja ...