Codeforces737E. Tanya is 5!
$n \leq 40$个人玩$m \leq 10$台游戏机,每台游戏机一秒内只能一人玩,每人一秒内只能玩一台。每台游戏机有个价格,在规定总价格内可以把一部分游戏机复制一次,每台只能复制一次。给每个人对在每台游戏机上的需求时间,求一种方案使得所有玩游戏结束的时间尽量早。每个人每台游戏需求时间$\leq 2500$。
先不考虑复制。$R_i$表示人$i$玩游戏总时间,$C_j$表示机器$j$被玩总时间。可以发现答案的下界是$max(max(R_i),max(C_j))$,叫$T$。然后把人和机器建一个二分图,保证每个点的度数为$T$,就能在上面不停地做最大匹配,就可以把答案定为$T$。这里这么搞:左边$n$个人和$m$个假人,右边$m$台机器和$n$个假机器,假的东西用来补度数。然后,两边会连四种边:(1)真人真机器,连很多条边,边数为对应时间(其实可以连一条边记一个边权);(2)假人真机器,如果那个机器的度数不到$T$,那它肯定有一段空闲时间为$T-C_j$,这么多条边连向他对应的假人;(3)真人假机器,同(2);(4)假人假机器,这时假人和假机器的度数不到$T$,可以把真人真机器的图复制一遍把每个点度数补到$T$。把“连很多条边”搞成“连一条边,记个边权”,每次做完最大匹配后把所有边权减去匹配边中最小的那一个,然后把边权为0的边删掉。此时如果一条匹配边左右两边都是真人真机器,把这个操作记录下来,以此输出方案。
然后是钱的问题。当$T$为某个$C_j$时钱有用,此时若有钱就复制他,把机器的被玩时间均分成两份,使得$T$变小。
//#include<iostream>
#include<cstring>
#include<cstdio>
//#include<time.h>
//#include<complex>
//#include<set>
//#include<queue>
//#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
} //Pay attention to '-' , LL and double of qread!!!! int n,m,B;
int a[],t[][],R[],C[]; bool co[];
struct Node{int a,b,c,d;}ans[]; int lans=; struct BG
{
int mp[][],p[],q[],n; bool vis[];
void clear(int N) {n=N;}
bool Pei(int x)
{
vis[x]=;
for (int i=;i<=n;i++) if (mp[x][i] && !q[i])
{
p[x]=i; q[i]=x;
return ;
}
for (int i=;i<=n;i++) if (mp[x][i] && q[i] && !vis[q[i]] && Pei(q[i]))
{
p[x]=i; q[i]=x;
return ;
}
return ;
}
void pei(int x) {memset(vis,,sizeof(vis)); Pei(x);}
}g; int main()
{
n=qread(); m=qread(); B=qread();
for (int i=;i<=m;i++) a[i]=qread();
for (int i=,x;i<=n;i++)
{
x=qread();
for (int j=,u,v;j<=x;j++)
{
u=qread(); v=qread();
t[i][u]=v;
}
} for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
R[i]+=t[i][j],C[j]+=t[i][j];
int T=,maxr=;
for (int i=;i<=n;i++) maxr=max(maxr,R[i]);
for (int j=;j<=m;j++) T=max(T,C[j]); T=max(T,maxr);
while (B)
{
int id=;
for (int j=;j<=m;j++) if (T==C[j] && co[j]) {id=-; break;}
if (id==-) break;
for (int j=;j<=m;j++) if (T==C[j]) {id=j; break;}
if (!id) break;
if (a[id]>B) break; int tot=T>>;
for (int i=;i<=n;i++)
{
if (tot<t[i][id]) {t[i][id+m]=tot; t[i][id]-=tot; break;}
else {tot-=t[i][id]; t[i][id+m]=t[i][id]; t[i][id]=;}
} co[id]=; B-=a[id];
C[id]=; for (int i=;i<=n;i++) C[id]+=t[i][id];
C[id+m]=; for (int i=;i<=n;i++) C[id+m]+=t[i][id+m];
T=; for (int j=;j<=m;j++) T=max(T,C[j]); T=max(T,maxr);
} g.clear(n+m+m);
for (int i=;i<=n;i++)
for (int j=;j<=m+m;j++) if (t[i][j])
g.mp[i][j]=g.mp[j+n][i+m+m]=t[i][j];
for (int i=;i<=n;i++) if (R[i]<T) g.mp[i][i+m+m]=T-R[i];
for (int j=;j<=m+m;j++) if (C[j]<T) g.mp[j+n][j]=T-C[j]; printf("%d\n",T);
for (int j=;j<=m;j++) printf("%d",co[j]); puts("");
lans=;
for (int i=;i<=n+m+m;i++) g.pei(i);
while (T)
{
int tmp=0x3f3f3f3f;
for (int i=;i<=n+m+m;i++) tmp=min(tmp,g.mp[i][g.p[i]]);
for (int i=;i<=n;i++) if (g.p[i]<=m+m)
ans[++lans]=(Node){i,g.p[i]<=m?g.p[i]:g.p[i]-m,T-tmp,tmp};
for (int i=;i<=n+m+m;i++) g.mp[i][g.p[i]]-=tmp;
for (int i=;i<=n+m+m;i++) if (g.mp[i][g.p[i]]==) {g.q[g.p[i]]=; g.p[i]=; g.pei(i);}
T-=tmp;
} printf("%d\n",lans);
for (int i=;i<=lans;i++) printf("%d %d %d %d\n",ans[i].a,ans[i].b,ans[i].c,ans[i].d);
return ;
}
Codeforces737E. Tanya is 5!的更多相关文章
- CodeForces 518B. Tanya and Postcard
B. Tanya and Postcard time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- codeforces 518B. Tanya and Postcard 解题报告
题目链接:http://codeforces.com/problemset/problem/518/B 题目意思:给出字符串 s 和 t,如果 t 中有跟 s 完全相同的字母,数量等于或者多过 s,就 ...
- Codeforces Round #288 (Div. 2)D. Tanya and Password 欧拉通路
D. Tanya and Password Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/508 ...
- CF Tanya and Postcard
Tanya and Postcard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #324 (Div. 2) B. Kolya and Tanya 快速幂
B. Kolya and Tanya Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/pro ...
- CodeForces - 508D Tanya and Password(欧拉通路)
Description While dad was at work, a little girl Tanya decided to play with dad characters. She has ...
- Codeforces Round #346 (Div. 2) C Tanya and Toys
C. Tanya and Toys 题目链接http://codeforces.com/contest/659/problem/C Description In Berland recently a ...
- 2016NEFU集训第n+3场 G - Tanya and Toys
Description In Berland recently a new collection of toys went on sale. This collection consists of 1 ...
- codeforce round#466(div.2) B. Our Tanya is Crying Out Loud
B. Our Tanya is Crying Out Loud time limit per test1 second memory limit per test256 megabytes input ...
随机推荐
- MIPS程序设计实例
第一题:用系统功能调用实现简单输入输出 题目要求 利用系统功能调用从键盘输入,转换后在屏幕上显示,具体要求如下: 1.如果输入的是字母(A~Z,区分大小写)或数字(0~9),则将其转换成对应的英文单词 ...
- vue cli的安装与使用
一.简介 vue作为前端开发的热门工具,受到前端开发人员的喜爱.为了简化项目的构建,采用vue cli来简化开发. vue cli是一个全局安装的npm包,提供了终端使用的命令.vue create可 ...
- go get 升级所有
go get -u all go get -u go mod update go get -u full_package_name go get -u github.com/... // ('. ...
- non-JRMP server at remote endpoint
#在相应的domain的domain.xml文件添加下面红色设置,并重启domain <admin-service system-jmx-connector-name="system& ...
- vsftp配置日志及其启用本地时间
vsftp配置日志及其启用本地时间 1. 启用vsftp日志 xferlog_enable=YES xferlog_std_format=YES xferlog_file=/var/log/xferl ...
- webpack执行命令的不同方式
如使用webpack3及之前的版本只需安装webpack3即可,因为之前的webpack里面集成了webpack-cli 1. 使用局部安装webpack和webpack-cli,使用package. ...
- C++系统学习之五:表达式
表达式由一个或多个运算对象组成,对表达式求值将得到一个结果.字面值和变量是最简单的表达式,其结果就是字面值和变量的值.把一个运算符和一个或多个运算对象组合起来可以生成较复杂的表达式. 基础 1.基本概 ...
- (57)zabbix Slide shows幻灯片展示
定义好screen之后,我们想了解服务器状况之时,一般会一个个screen点过去,zabbix提供了幻灯片展示方法,可以定义多个Slide,一个slide中可以包含多个screen. 创建slide ...
- Linux-ngnix服务(二)
Nginx介绍 特性: 模块化设计,较好的扩展性 高可靠性 支持热部署:不停机更新配置文件,升级版本,更换日志文件 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存 ...
- cache控制器取值从TCM/CACHE/FLASH
cache 控制器顶层有4组接口,分别为输入I/D bus ,输出TCM bus /Cache bus /direct flash bus (走cache ID bus matrix) flash 控 ...