51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释
题目:51nod:
题目Codeforces:
题目注意到两个战舰不能挨在一起就可以了。
// 每一段 struct node{int left; // 段的左端点int right; // 段的右端点int length; // 段长度int ship; // 段最大容纳战舰数 }arr[200005];
每一段可容纳战舰数:
ship*a + (ship - 1) <= length; --> ship = (length+1) / (a+1);(舍去小数部分)
构造出这么一个数据结构就简单了。
现在还有一个问题:找到说miss的点所在段还需要时间,就算是二分查找也需要O(log(n)),加上遍历的O(n),时间复杂度O(n*log(n))。
可不可能会超时呢?我认为有可能,所以保险起见,我用了一个数组index[i]表示第i个点所在的段,用空间换时间,比较值。
一次就AC了,思路就这么多,上代码把:
#include <bits\stdc++.h> using namespace std; typedef long long ll;// 每一段 struct node{int left; // 段的左端点int right; // 段的右端点int length; // 段长度int ship; // 段最大容纳战舰数 }arr[200005]; int len = 0; // 段的数量int index[200005]; // 每一个点所处的段int n,k,a,m; int miss; // 每一次说miss的位置。int sumShip = 0; // 现阶段可容纳最多战舰数// 获取某段可容纳最大战舰数量 int maxShip(node node1){return (node1.length+1)/(a+1); }//初始化 void init(){arr[0].left = 1;arr[0].right = n;arr[0].length = arr[0].right - arr[0].left + 1;arr[0].ship = maxShip(arr[0]);sumShip = arr[0].ship;len = 1; }//更新段 void updataNode(int miss){int con = index[miss]; // miss位置所在段node* x = &arr[con]; //取出这个段int shipNum = x->ship;arr[len].left = miss+1;arr[len].right = x->right;arr[len].length = arr[len].right - arr[len].left + 1;arr[len].ship = maxShip(arr[len]);replace(index+arr[len].left,index+arr[len].right+1 , con ,len); // 将其中一部分所在段改变 x->right = miss-1;x->length = x->right - x->left + 1;x->ship = maxShip(*x);sumShip -= shipNum - arr[len].ship - x->ship; // 总容纳战舰数减少的数量等于分段后减少的战舰数量 len++; }int main() {cin >> n >> k >> a >> m;init(); // 初始化for(int i = 1;i <= m; ++i){cin >> miss;updataNode(miss); // 更新段if(sumShip < k){cout << i << endl;return 0;}}cout << -1 << endl;return 0; } //written by zhangjiuding.
代码中涉及到的replace是头文件algorithm中的,
replace(a+3,a+10,p,q);
表示的是将a[i](i = [3,9])中的p全部换成q。
51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释相关推荐
- 51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释...
题目:51nod: 题目Codeforces: 题目注意到两个战舰不能挨在一起就可以了. // 每一段 struct node{int left; // 段的左端点int right; // 段的右端 ...
- 51 nod 1427 文明 (并查集 + 树的直径)
1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫"文明"的游戏.大妈正在 ...
- 一维战舰(51Nod-1521)
题目 爱丽丝和鲍博喜欢玩一维战舰的游戏.他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格). 在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博.每一只战舰的形状是 1×a ...
- 51 nod 1405 树的距离之和
1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和. ...
- 51 nod 1439 互质对(Moblus容斥)
1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],-,a[n].有一个集合,刚开 ...
- [STL乱搞]51 Nod——1573 美丽的集合
[STL乱搞]51 Nod--1573 美丽的集合 题目梗概 在多重集之中,同一个元素可以出现多次. 我们现在有n个多重集合,第i个集合最开始都有一个元素ai(1≤i≤n). 定义多重集合的价值为子集 ...
- 51 nod 1006 最长公共子序列Lcs
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 参考博客 :http://blog.csdn.net/yysdsy ...
- 51 nod 1495 中国好区间 奇葩卡时间题 700ms 卡O(n*log(n)), 思路:O(n)尺取法
题目: 这个题目竟然叫中国好区间,要不要脸.欸,不得不说还蛮顺口的,哈哈哈. 首先我们有一个数组a.可以递推得来,O(n)时间复杂度. 定义left(有效区间的左端点),bigger(有效区间中大于等 ...
- 51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找
题目: 写这题花了我一上午时间. 下面是本人(zhangjiuding)的思考过程: 首先想到的是三行,每一行一定要走到. 大概是这样一张图 每一行长度最少为1.即第一行(i -1) >= 1, ...
最新文章
- HDU - 2767 Proving Equivalences tanjar强连通-DAG性质
- vue json 导出 excel
- boost::fibers::unbuffered_channel用法的测试程序
- 程序员面试100题之十四:强大的和谐
- 用xfire开发webservice实例
- loj2245 [NOI2014]魔法森林 LCT
- 可盈可乐未能连接到服务器,CoinCola可盈可乐 场外OTC平台使用方法
- 熊猫烧香病毒背后的***社会
- JetBrains系列WebStorm等中文输入法无法跟随光标的问题的解决办法
- opencv编译找不到nvcuvid.h文件
- 阿里P7跳槽后曝光薪资截图:新公司月入税后五万多,很满足!
- python爬虫常用模块介绍_python爬虫常用的模块分析
- 福禄克FLUKE OptiFiber Pro HDR OTDR光时域反射(OTDR)测试仪OFP2-100-S
- ns手柄pc驱动_颜值、功能、手感同步在线 北通宙斯机械游戏手柄体验
- Abis接口的概念和引发的商业策略
- 《徐卓-心理咨询师校园报告 》--心得
- 理解pem pfx文件
- Android人脸识别和证件识别
- 99.999999%人看不出来的水印,专治各种盗图
- 视杯和视盘分割及分类方法对青光眼诊断的探讨
热门文章
- 每日程序C语言2-判断某日期是这一年的第几天
- 为什么parsefloat加出来还是字符串_为什么酒店的包子做的这么好吃?里面加了什么说出来你可能不信...
- final在java中的含义_在java中一个类被声明为final类型,表示的意思是()
- linux下的ssh和rynsc
- 从 0 到 1 实现 React 系列 —— 4.setState优化和ref的实现
- PHP索引数组+unset使用不当导致的问题
- linux centos7 安装redis
- PHP中file_exists()函数不支持中文文件名解决办法
- 操作系统实验报告9:进程间通信—管道和 socket 通信
- 【数据结构与算法】之深入解析图的拓扑排序