【NOIP2011模拟11.1】钓鱼
钓鱼
题目
Description
我们把钓鱼的过程放在坐标系里来考虑。图中蓝色的点为船,初始时它的坐标记为(Ax,y)。河深为y,河宽为x。某个时刻会从左边界或右边界游出来一条鱼(左边的往右边游,右边的往左边游),即鱼游出来时的横坐标为0或x,这条鱼每秒会游D个单位长度,鱼的长度为L。初始时刻为0,对于每个时刻x,船可以选择花费1s向左或向右移动最多Q个单位长度,或者选择在当前位置进行钓鱼,钓鱼的动作是瞬间的,且发生在时刻x,鱼还来不及移动就被钓上了。如果选择钓鱼,那么在时刻x就不能动。{x+1时刻可以选择移动}设当前位置为z,将鱼看成一条线段,当线段与直线x=z相交时就认为鱼上钩了,所以一次钓鱼动作可能会钓多条鱼。
聪明的你告诉钓鱼者,在T时刻前最多能钓多少鱼?
Input
输入:
第一行:T
第二行:Maxx,Maxy,表示河宽和河深
第三行:两个数Ax,Q
第四行:N,表示有N条鱼
接下来N行描述每条鱼:每行共五个数,x,y,D,L,time
x表示鱼头的初始位置,保证为0或maxx,y表示鱼头的初始深度,time表示鱼出现的时刻(所有的数都为整数)
Output
输出:
只有一行:ans,表示最多的钓鱼数
Sample Input
3
4 5
4 1
3
0 1 3 1 0
4 2 2 1 0
0 3 3 1 2
Sample Output
3
Data Constraint
100%的数据满足
1<=T,time<=10
1<=Ax,Ay,Q,x,y,D,L<=10
1<=N<=14
30%的数据满足
1<=N<=5
总结
考试的时候想到了状压DP,但没有进一步去想
其实这题的转移方程十分简单,也容易想到,但是就是放弃了
所以说有想法就可以继续钻研下去
题解
首先题目要求的是T时刻前,其实是包括T的
所以说总共会进行T+1次操作
看到N很小,考虑状压
设\(f[i][j][s]\)表示现在是\(i\)时刻,\(j\)位置,鱼的情况是\(s\)(被钓了是1,没有是0)的最大鱼数
转移分两种(以下方程都需要和原来的取\(max\))
- 移动。那么\(f[i+1][j-q…j+q][s]=f[i][j][s]\)
- 钓鱼。\(f[i+1][j][s1]=f[i][j][s]+sum\)
\(s1\)表示钓鱼后的情况,\(sum\)表示钓上来的数量
对于判断是否钓上来,可以预处理每条鱼在每一分钟的位置,然后循环扫一遍
初始化\(f[0][Ax][0]=0\),其余的是-1
Code
#include<bits/stdc++.h>
using namespace std;
int t,mx,my,pos,q,n,sum,s1,ans,st[15],de[15],v[15],l[15],_time[15],fh[15],head[15][15],tail[15][15],f[15][15][33000];
int read()
{
int res=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch-'0'),ch=getchar();
return res;
}
int main()
{
t=read();mx=read();my=read();pos=read();q=read();n=read();
for (int i=1;i<=n;++i)
{
st[i]=read();de[i]=read();v[i]=read();l[i]=read();_time[i]=read();
if (st[i]==0) fh[i]=1;
else fh[i]=-1;
}
for (int i=1;i<=n;++i)
for (int j=0;j<=t;++j)
{
if (_time[i]==j)
{
head[i][j]=st[i];
tail[i][j]=st[i]-fh[i]*l[i];
}
if (_time[i]<j)
{
head[i][j]=head[i][j-1]+fh[i]*v[i];
tail[i][j]=tail[i][j-1]+fh[i]*v[i];
}
}
memset(f,-1,sizeof(f));
f[0][pos][0]=0;
for (int i=0;i<=t;++i)
for (int j=0;j<=mx;++j)
for (int s=0;s<(1<<n);++s)
{
if (f[i][j][s]==-1) continue;
for (int k=max(0,j-q);k<=min(j+q,mx);++k)
f[i+1][k][s]=max(f[i+1][k][s],f[i][j][s]);
sum=0;
s1=s;
for (int k=1;k<=n;++k)
if (_time[k]<=i&&!(s1&(1<<(k-1))))
if ((head[k][i]>=j&&tail[k][i]<=j)||(head[k][i]<=j&&tail[k][i]>=j)) ++sum,s1|=(1<<(k-1));
f[i+1][j][s1]=max(f[i+1][j][s1],f[i][j][s]+sum);
}
ans=-1;
for (int k=0;k<=t+1;++k)
for (int i=0;i<=mx;++i)
for (int j=0;j<(1<<n);++j)
ans=max(ans,f[k][i][j]);
printf("%d\n",ans);
return 0;
}
【NOIP2011模拟11.1】钓鱼的更多相关文章
- JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C
3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...
- JZOJ 3508. 【NOIP2013模拟11.5B组】好元素
3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms Mem ...
- 8.1 NOIP模拟11
8.1 NOIP模拟 11 今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我..... ...
- JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)
3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...
- JZOJ 3505. 【NOIP2013模拟11.4A组】积木(brick)
3505. [NOIP2013模拟11.4A组]积木(brick) (File IO): input:brick.in output:brick.out Time Limits: 1000 ms Me ...
- JZOJ 3526. 【NOIP2013模拟11.7A组】不等式(solve)
3526. [NOIP2013模拟11.7A组]不等式(solve) (File IO): input:solve.in output:solve.out Time Limits: 1000 ms M ...
- JZOJ 4298. 【NOIP2015模拟11.2晚】我的天
4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...
- JZOJ 3929. 【NOIP2014模拟11.6】创世纪
3929. [NOIP2014模拟11.6]创世纪 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 上帝手 ...
- JZOJ 3928. 【NOIP2014模拟11.6】射击
3928. [NOIP2014模拟11.6]射击 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 有问题, ...
随机推荐
- shp文件转dwg并创建文本标注
不得不说,ArcGIS 和 CAD 之间的兼容性非常差,shapefile文件和dwg文件之间互相转换会丢失各种属性,但是很多时候他们之间的转换对我们来说是刚需.通常我们都是通过第三方软件(如FME) ...
- NOIP 2013 P1967 货车运输
倍增求LCA+最大生成树 题目给出的是一张图,在图上有很多算法无法实现,所以要将其转化为树 题中可以发现货车的最后的载重量是由权值最小的一条边决定的,所以我们求最大生成树 求完最大生成树后我们得到一个 ...
- 面试 之 nginx,负载,动静分离
大家先看这个逻辑图 为什么我们要这样去架构我们的一个项目呢? 这样做的话,动态请求要先访问 A,A 转发访问 B,再由 B 返回结果给 A,A 最后又将结果返回给客户端这样是不是很麻烦? 最初开发的时 ...
- leetcode138container-with-water
题目描述 给定n个非负整数a1,a2,-,an,其中每个数字表示坐标(i, ai)处的一个点.以(i,ai)和(i,0)(i=1,2,3...n)为端点画出n条直线.你可以从中选择两条线与x轴一起构成 ...
- 鸿蒙开发板外设控制 之 实现物理按键的“长按事件”(按键通用框架 V0.0.2)
我在之前的帖子<实现按键"按下事件"和"释放事件"的通用框架(V0.0.1)>中阐述了DTButton-V0.0.1的设计思路,并且也在帖子中开源了 ...
- 五分钟看懂抓包神技:DPDK
我是一个网络监控软件,我被开发出来的使命就是监控网络中进进出出的所有通信流量. 一直以来,我的工作都非常的出色,但是随着我监控的网络越来越庞大,网络中的通信流量也变得越来越多,我开始有些忙不过来了,逐 ...
- 12装饰器及*args,**kwargs
注:参数和返回值都是一个函数. 1,无参数 def decotare1(func): def wrapper(): print("First") func() return wra ...
- Spider--实战--selenium_12306
# login12306_02 # 图像识别涉及到深度学习,这里直接将验证码识别任务发送到大佬的验证码解析地址,不过现在已经失效了,程序跑到这会报错. # 用户名和密码存储在本地工作目录中的 user ...
- high Performance
目的 找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈): 提供性能优化的方案(升级硬件?改进系统系统结构?): 达到合理的硬件和软件配置: 使系统资源使用达到最大的平衡. CPU过渡使用会造成大量进程等待C ...
- tcpack--3快速确认模式
接收到数据报后,会调用tcp_event_data_recv(),不管是在慢速路径的tcp_data_queue中调用还是 在快速路径中处理接收数据后直接调用,注意(如果len <= tcp_h ...