Description

Flappy Bird是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败。
现在小鸟们遇到了一个难题,他们遇到了一堵巨大的墙,墙上仅有m个洞供他们通过,由于小鸟们的体型不同且墙上洞的形状也不同,所以每种体型的鸟通过每个洞的时间都不同,鸟的体型共有n种,第i种体型的鸟通过第j个洞需要的时间记为T(i,j),且一个洞必须前一只鸟通过之后后一只鸟才能开始通过。
从时刻0开始,鸟开始通过,而每一只鸟的等待时间为从时刻0到自己已经通过洞的时间。现在知道了第i种体型的鸟有pi只,请求出使所有鸟都通过墙的最少的等待时间之和。

Solution

看上去就像费用流,但是由于标着个NOIP就没敢打。结果爆零。
首先很显然的是S向每种鸟连一条费用为0,容量为p[i]的边。
设鸟的个数有pp个。
如果一个洞j被一只鸟i最后一次到达,那么会对答案造成t[i][j]的影响,倒数第二个到达会造成t[i][j]*2的影响因为最后一个到达的还要多等t[i][j]的时间……
那么可以把每个洞拆成pp个点,每种鸟i都向洞j拆成的倒数第k次到达的点(拆成的第k个点)连一条费用为t[i][j]*k,容量为1的边。
然后每个洞拆成的所有点都向T连一条费用为0,容量为1的边。
然后跑一次最小费用最大流就好了。两种方法:1、zkw;2、spfa(这道题spfa比较快)

边数太多!!!

一共有100个洞,800只鸟,会拆除80000个点,40种鸟向80000个点连边会连出3200000条边,跑一跑绝对会烂掉。
考虑动态加边。
一开始每个洞只拆成一个点(注意这时向T的连边也只有这些点),然后跑一次增广,找到增广的那条路径填上的洞,然后这个洞再多拆出一个点,n中鸟向它建边,它向T连边。
这样动态加边时间就会快很多。

为什么NOI的题会被表上NOIP给我们做

NOI2012美食节

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define rep(i,a) for(i=first[a];i;i=next[i])
using namespace std;
const int maxn=500007;
int i,j,k,l,n,m,ans;
int p[maxn],t[1007][1007],S,T,o,hou;
int first[maxn*2],next[maxn*2],last[maxn*2],chang[maxn*2],fan[maxn*2],cost[maxn*2],num,pp;
int bz[maxn],d[maxn],id,now[maxn],sh[maxn],data[maxn],ci;
void add(int x,int y,int z,int o){last[++num]=y;next[num]=first[x];first[x]=num;chang[num]=z;cost[num]=o;fan[num]=num+1;last[++num]=x;next[num]=first[y];first[y]=num;chang[num]=0;cost[num]=-o;fan[num]=num-1;
}
bool spfa(){int head,tail,now,i,j,p,q;fo(i,S,T)d[i]=0x7fffffff;q=d[0];bz[0]=1;d[0]=0;data[1]=0;head=0;tail=1;while(head<tail){now=data[++head];i=first[now];while(i!=0){if(chang[i]&&d[last[i]]>d[now]+cost[i]){d[last[i]]=d[now]+cost[i];sh[last[i]]=i;if (!bz[last[i]]){data[++tail]=last[i];bz[last[i]]=1;}}i=next[i];}bz[now]=0;}if(d[T]!=q)return 1;return 0;
}
void zeng(){int i=sh[T],j=0x7fffffff,k=0;for(;i;i=sh[last[fan[i]]])j=min(j,chang[i]),k+=cost[i],chang[i]-=j,chang[fan[i]]+=j;;ans+=j*k;// for(i=sh[T];i;i=sh[last[fan[i]]])int hou=last[fan[sh[T]]]-n;if(hou%pp){hou++;int a=(hou-1)/pp+1,b=((hou-1)%pp+1);add(n+hou,T,1,0);fo(i,1,n){int v=t[i][a]*b;add(i,n+hou,1,v);}}
}
int main(){
//  freopen("fan.in","r",stdin);scanf("%d%d",&n,&m);fo(i,1,n){scanf("%d",&p[i]);pp+=p[i];add(S,i,p[i],0);}S=0,T=pp*m+n+1;fo(i,1,n){fo(j,1,m){scanf("%d",&t[i][j]);}}fo(i,1,n)fo(j,1,m)add(i,n+(j-1)*pp+1,1,t[i][j]);o=0;fo(j,1,m)add(n+(j-1)*pp+1,T,1,0);while(spfa())zeng(); printf("%d\n",ans);
}

【NOIP提高】飞扬的小鸟相关推荐

  1. NOIP 2014 飞扬的小鸟

    描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告 ...

  2. C++——NOIP提高组——飞扬的小鸟

    飞扬的小鸟[NOIP2014提高组] 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟 ...

  3. Star Way To Heaven (prim最小生成树) // [ NOIP提高组 2014]飞扬的小鸟(DP)

    文章目录 T1:Star Way To Heaven 题目 题解 代码实现 T2:飞扬的小鸟 题目 题解 代码实现 T1:Star Way To Heaven 题目 小 w 伤心的走上了 Star w ...

  4. P1941 [NOIP2014 提高组] 飞扬的小鸟

    题目来源 [NOIP2014 提高组] 飞扬的小鸟 - 洛谷 题目考点 动态规划,dp    枚举,暴力    背包 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点 ...

  5. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

    2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...

  6. P1941 [NOIP2014 提高组] 飞扬的小鸟——解题报告

    一.题目链接: P1941 [NOIP2014 提高组] 飞扬的小鸟 二.题目大意 游戏界面是一个长为nnn,高为mmm的二维平面,其中有kkk个管道(忽略管道的宽度).小鸟始终在游戏界面内移动.小鸟 ...

  7. Codevs 3729==洛谷P1941 飞扬的小鸟

    P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 Flappy Bird 是一款风 ...

  8. 飞扬的小鸟1.0测试版

    飞扬的小鸟1.0测试版 为了实战一下图形库的绘制所以尝试了一次动态游戏的制作,事实上这个游戏的代码实现十分简单,只要花时间多加入几个功能就可以了,下面先把1.0测试版放上来,后续再完善功能. 注1:V ...

  9. NOIP提高组1580~1590集合答案

    1880:[13NOIP提高组]华容道时间限制: 1000 ms 内存限制: 131072 KB 提交数: 298 通过数: 124 [题目描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才 ...

  10. 洛谷 飞扬的小鸟(混合背包,细节)

    题目链接: [NOIP2014 提高组] 飞扬的小鸟 - 洛谷 思路: 表示到达(i, j)点最少需要的跳跃次数.每个 f 值根据上一个对应位置,加上这一次的跳跃/下降得到. 计算完所有 f 值之后, ...

最新文章

  1. 机器学习(10)随机森林(预测泰坦尼克号旅客存活率)
  2. C# ManualResetEvent
  3. plsql tables 没有表_天长视唱练耳辅导班收费表,安徽高考音乐培训学校,你知道吗...
  4. SSM+BJUI实现CRUD的报表功能
  5. localdatetime转化为date_为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?
  6. [导入]人的一生能有几天?
  7. 简谈造成循环引用的原因以及处理办法
  8. 【Java24】健康项目:环境搭建,预约管理(检查项和检查组管理)
  9. Hdu 4916 Count on the path
  10. 如何修改SharePoint服务器场管理员帐户和密码
  11. oracle磁带的使用期限,rman删除磁带库过期备份问题
  12. jq获取id的名称_查找 Linux 发行版名称、版本和内核详细信息 | Linux 中国
  13. Django 博客教程(三):创建应用和编写数据库模型
  14. ashx一般处理程序
  15. 微软请你学Linux,最后4节课,即将收官,错过了就没有了!
  16. MySQLi学习笔记 :二(  排序查询,聚合函数,分组查询,分页查询) 约束     多表之间的关系   范式     数据库的备份和还原
  17. Java开发过程中需要注意的技巧有哪些?
  18. ionic安装拍照选照片插件
  19. Spring IoC-02
  20. pycharm项目目录结构_VOCs吸附回收装置和焚烧装置列入新版产业结构调整指导目录鼓励类项目...

热门文章

  1. 组合数学之第一章之完美覆盖,断层线,幻方,拉丁方,Nim取子游戏
  2. Burp suite的扫描模块
  3. Office下载记录
  4. 重磅:国家基金委八大学部公布“优先发展领域及主要研究方向”
  5. 数值分析(7):函数逼近
  6. linux 极点五笔,Linux 安装ibus极点五笔输入法备忘录
  7. steam的游戏id怎么查?
  8. 在Word中如何设置分级标题?
  9. 干法读后感--磨练灵魂 提升心志
  10. 第5章 NameNode和SecondaryNameNode