2017.10.17 蜘蛛难题 思考记录
强烈建议不要做此题,此题描述差到极点!毒瘤出题人
首先有想法就是从起点往后按照出水管依次满足,但多个水域需要合起来求下一个最低出水口,所以并不是很好维护
所以最好按照时间模拟
先求出当前状态下的最低水平面,
然后看这些最低的面能不能通过出水口到达新的水坑,把这些水坑加入当前状态
然后再求一次当前状态下的最低水平面
然后再把他们依次灌1,,,
直到蜘蛛所在的上一块被灌,,输出上次的答案
然后就需要根据题目坑爹的描述特判:
1、第一个水坑的坑底的蜘蛛0秒被灌
2、正好在坑顶的蜘蛛会被灌
bzoj 原题discus有良心数据,另官方数据第九个输出是-1
码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int n,i,m,v[30],v2[30],x,y,yy,ans,minn,zd,sx[30],j,top,last;
bool vis[30];
struct la
{int x,y,yy;
}g[30];
vector<int>vv;
int tu[105],lt[30][205],sta[30];
bool cmp(la a,la b)
{return a.x<b.x;
}
void dfs(int o)
{
if(vis[lt[o][g[o].y+g[o].yy]]==0)
{vis[lt[o][g[o].y+g[o].yy]]=1;vv.push_back(lt[o][g[o].y+g[o].yy]);dfs(lt[o][g[o].y+g[o].yy]);
}
}
int main()
{vis[0]=1;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].yy); }scanf("%d",&m);for(i=1;i<=n;i++)tu[g[i].x]=i;
// memset(v,0x7f,sizeof(v));for(i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&yy);
lt[tu[x-1]][y]=tu[x+yy];
lt[tu[x+yy]][y]=tu[x-1]; }minn=999999;scanf("%d%d",&zd,&yy);if(zd==1&&yy==g[1].y+g[1].yy){printf("0");return 0;}vv.push_back(1);vis[1]=1;while(1){//求出目前水位最低的int maxx=-1;top=0;for(i=0;i<vv.size();i++) { if(maxx==g[vv[i]].y+g[vv[i]].yy){sta[++top]=vv[i]; } if(g[vv[i]].y+g[vv[i]].yy>maxx){top=0;maxx=g[vv[i]].y+g[vv[i]].yy;sta[++top]=vv[i];}}//如果加进去最终会流到哪
for(i=1;i<=top;i++)
{dfs(sta[i]);
}//再求一遍当前最小 top=0;for(i=0;i<vv.size();i++) { if(maxx==g[vv[i]].y+g[vv[i]].yy){sta[++top]=vv[i]; } if(g[vv[i]].y+g[vv[i]].yy>maxx){top=0;maxx=g[vv[i]].y+g[vv[i]].yy;sta[++top]=vv[i];}}//果断加水for(i=1;i<=top;i++){if(sta[i]==zd&&g[sta[i]].y+g[sta[i]].yy==yy){printf("%d",ans);return 0; }}for(i=1;i<=top;i++){g[sta[i]].yy--;ans++;if(g[sta[i]].yy<0) {printf("-1");return 0; } } //检验答案if(g[zd].y+g[zd].yy+1==yy){printf("%d",last);return 0;} last=ans;}
}
2017.10.17 蜘蛛难题 思考记录相关推荐
- 2017.10.29 染色方案 思考记录
这个题数据特别小,于是想到状压多维之流. 状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些 根据15去设计状态是没有前途的,因为按颜色分一定会MLE 这时就考虑根据5分,这样不同颜色就离散了,就 ...
- 2017.10.24 上升序列 思考记录
终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...
- 2017.10.9 放棋子 思考记录
.这个题根本没想到错排,但它似乎离散为斜对角之后很有规律,于是打表,推出了式子... 经常手玩式子,前几天的测试根本没想到卡特兰数然后用组合数硬生生凑了出来,然后这个题的错排.. f表示答案 g表示 ...
- 2017.10.7 括号序列 思考记录
这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...
- 2017.10.30 覆盖问题 思考记录
从细节入手已经从一种技巧变成一种策略了. 题目给出的条件很奇怪,是3个正方形,, 为什么是3个而不是4个或2个呢.. 于是先用一个大矩形把所有点卡住 然后显然矩形的每个边 都有一个正方形和他在一条直线 ...
- 2017.10.29 软件安装 思考记录
这个题一开始卡了,,就是树内的必选和可选分不太清 ,其实很好分,对于一个子树,根是必选,子节点是可选 然后递归保证正确性 可选就是把每个花费都看成一个物品往里背包 注: 1.必选<c[o]的要清 ...
- 2017.10.26 星际贸易 思考记录
这个题非常繁琐,而且网上的题解非常不详细.. 首先第一问 由于所有的点都要走到,所以就是01背包 需要可持久化背包来输出方案..类似floyd的判断方式 然后这些选定的点都一定是要维护的, 第二问就是 ...
- 2017.10.25 打鼹鼠 思考记录
挺直白的dp 离散的是移动的过程,因为经过一番移动一定是为了出现在某个地点 所以直接m^2枚举,类似lis的转移即可 码: #include<iostream> #include<c ...
- 2017.10.19 大陆争霸 思考记录
一上来想到拓扑分层最短路,但需要多源最短路.. 这题考查的是对dij的理解 dij只能跑最短路每次都找极值点进行一次拓展,同时不能有负边权 所以一次需要确定 两个值都确定的一个点所以扩展的条件有两个 ...
最新文章
- 北京大学崔斌教授组招收图机器学习、AutoML等方向科研实习生
- ubuntu系统安装FTP
- ZCMU 1894: Power Eggs
- 115个Java面试题和答案——终极列表(下)
- RAC静默安装与DG搭建
- PhalGo-Echo路由
- 小程序发布上线流程_微信小程序发布流程
- 线性代数----逆矩阵的性质和求法
- Dubbo扩展点注解之@Adaptive
- 年龄识别数据集IMDB-WIKI
- Hadoop系列之二:大数据、大数据处理模型及MapReduce
- html实现360展示图片,js html5 360度全景图片预览效果
- JAVA中GUI在Button中设置中文乱码问题
- 强化学习适合解决什么样的问题
- 芯盾时代: 开启“智慧身份认证”新时代
- 国米w ndows错误,欧冠国米1:2巴萨!球迷一席话揭球队输球真因,一语中的
- 基于深度学习的大规模交通标志识别(附6GB交通标志数据集)
- 中科院计算机和理论物理双硕士白,中国科学院等离子体物理研究所
- 【GDPMS】项目管理实战公益培训第十二期
- 兆声清洗晶片过程中去除力的分析
热门文章
- Spring和SpringMVC整合
- mysql5.7开启二进制日志_MySQL5.7二进制日志
- LaTeX TikZ绘图——组合数学中棋盘多项式的画法
- python replace函数后面的数字的含义
- 使用WORD封面自带模板?
- python的自带的ide运行_为什么同样的语句在python自带的ide和pycharm中运行的结果不一样?...
- 如何删除git config中的某一个配置项
- jQuery学习之三---工具
- 数组中的两个常见异常
- android 下拉刷新实现方式,Android RecyclerView设置下拉刷新的实现方法