题目:51nod:

题目Codeforces:

题目注意到两个战舰不能挨在一起就可以了。

  1. // 每一段
  2. struct node{
  3. int left; // 段的左端点
  4. int right; // 段的右端点
  5. int length; // 段长度
  6. int ship; // 段最大容纳战舰数
  7. }arr[];

每一段可容纳战舰数:

ship*a + (ship - 1) <= length;   -->   ship = (length+1) / (a+1);(舍去小数部分)

构造出这么一个数据结构就简单了。

现在还有一个问题:找到说miss的点所在段还需要时间,就算是二分查找也需要O(log(n)),加上遍历的O(n),时间复杂度O(n*log(n))。

         可不可能会超时呢?我认为有可能,所以保险起见,我用了一个数组index[i]表示第i个点所在的段,用空间换时间,比较值。

一次就AC了,思路就这么多,上代码把:

  1. #include <bits\stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4.  
  5. // 每一段
  6. struct node{
  7. int left; // 段的左端点
  8. int right; // 段的右端点
  9. int length; // 段长度
  10. int ship; // 段最大容纳战舰数
  11. }arr[];
  12. int len = ; // 段的数量
  13.  
  14. int index[]; // 每一个点所处的段
  15.  
  16. int n,k,a,m;
  17. int miss; // 每一次说miss的位置。
  18.  
  19. int sumShip = ; // 现阶段可容纳最多战舰数
  20.  
  21. // 获取某段可容纳最大战舰数量
  22. int maxShip(node node1){
  23. return (node1.length+)/(a+);
  24. }
  25.  
  26. //初始化
  27. void init(){
  28. arr[].left = ;arr[].right = n;
  29. arr[].length = arr[].right - arr[].left + ;
  30. arr[].ship = maxShip(arr[]);
  31. sumShip = arr[].ship;
  32. len = ;
  33. }
  34.  
  35. //更新段
  36. void updataNode(int miss){
  37. int con = index[miss]; // miss位置所在段
  38. node* x = &arr[con]; //取出这个段
  39. int shipNum = x->ship;
  40.  
  41. arr[len].left = miss+;
  42. arr[len].right = x->right;
  43. arr[len].length = arr[len].right - arr[len].left + ;
  44. arr[len].ship = maxShip(arr[len]);
  45. replace(index+arr[len].left,index+arr[len].right+ , con ,len); // 将其中一部分所在段改变
  46.  
  47. x->right = miss-;
  48. x->length = x->right - x->left + ;
  49. x->ship = maxShip(*x);
  50.  
  51. sumShip -= shipNum - arr[len].ship - x->ship; // 总容纳战舰数减少的数量等于分段后减少的战舰数量
  52.  
  53. len++;
  54. }
  55.  
  56. int main() {
  57.  
  58. cin >> n >> k >> a >> m;
  59.  
  60. init(); // 初始化
  61.  
  62. for(int i = ;i <= m; ++i){
  63. cin >> miss;
  64. updataNode(miss); // 更新段
  65. if(sumShip < k){
  66. cout << i << endl;
  67. return ;
  68. }
  69. }
  70. cout << - << endl;
  71. return ;
  72. }
  73. //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 有详细注释的更多相关文章

  1. 51 nod 1521 一维战舰(二分)

    传送门 题意 分析 这是我在51nod上的第2题,下载了4个数据,得不偿失?我太菜啦 一开始wa了6个点,下数据后发现舰与舰不能相邻,再交wa,发现l和r都没设好,再wa,发现check里面[1,b[ ...

  2. 51Nod 1521 一维战舰

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1521 思路:先计算出一开始最多能放多少艘战舰,然后每次输入一个点后,找到 ...

  3. 51 Nod 一维战舰

    1521 一维战舰  题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 爱丽丝和鲍博喜欢玩一维战舰的游戏.他们在一行 ...

  4. 51 nod 1766 树上的最远点对(线段树+lca)

    1766 树上的最远点对 基准时间限制:3 秒 空间限制:524288 KB 分值: 80 难度:5级算法题   n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个 ...

  5. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...

  6. 51 nod 1495 中国好区间

    1495 中国好区间 基准时间限制:0.7 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   阿尔法在玩一个游戏,阿尔法给出了一个长度为n的序列,他认为,一段好的区间,它的长度是& ...

  7. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...

  8. 51 nod 1055 最长等差数列(dp)

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 5 6 8 9 ...

  9. 51 nod 1421 最大MOD值

    1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...

随机推荐

  1. python 二进制转换

    #二进制装换msg = "大家好"msg1 = msg.encode(encoding='utf-8')#转换成二进制print(msg1)msg2 = msg1.decode(' ...

  2. 【Linux部署 · GIT】在linux系统安装git和配置实现SSH

    领导给了一个不开放ftp的测试库,让我部署项目.拿到一个全新的环境,真是个练手的好机会. 该操作系统为:CentOs release 6.5(Final) 由于不开放ftp,所以上传下载代码是非常麻烦 ...

  3. 基于SSM实现的简易员工管理系统

    之前自学完了JAVA基础,一直以来也没有做什么好玩的项目,最近暑假,时间上比较空闲,所以又学习了一下最近在企业实际应用中比较流行的SSM框架,以此为基础,通过网络课程,学习编写了一个基于SSM实现的M ...

  4. 堆排序Java实现

    package practice; import edu.princeton.cs.algs4.StdRandom; public class TestMain { public static voi ...

  5. 快速排序Java实现

    package practice; import edu.princeton.cs.algs4.*; public class TestMain { public static void main(S ...

  6. 循环checked表单 元素

    var poject_Array = "";            $('input[name="yearCardPoject"]:checked').each ...

  7. 移动端图片放大滑动查看-插件photoswipe的使用

    最近在开发项目的时候,遇到一个需求,需要移动端实现放大查看图片的功能,然后我就在网上搜索了一下资料,看到了photoswipe这个插件,后来试了试,确实挺好用的,它可以实现手势放大缩小查看图片,左右滑 ...

  8. AOP TP框架有感

    自学AOP感觉面向切面编程是一种利器,同时也是一种潜在的威胁.他就像一把手术刀,无论哪个器官有问题他都可以把他切开,修复它,但是使用的多了身体也会受不了... AOP应该算是面向对象的一种补充,但是, ...

  9. python--购物车优化

    基本要求:用户入口1.商品信息存在文件里 2.已购商品.余额记录,长期保存, 即第一次启动是需要输入预算的,以后就拿剩下的钱买东西 商家入口 1.可以添加商品,删除商品,修改商品价格 2.按q可以退出 ...

  10. 团队作业4——第一次项目冲刺(Alpha版本) 日志集合处

    第一天(2017.4.23) http://www.cnblogs.com/1413none/p/6752325.html 第二天(2017.4.24) http://www.cnblogs.com/ ...