题目:51nod:

题目Codeforces:

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

// 每一段
struct node{
int left; // 段的左端点
int right; // 段的右端点
int length; // 段长度
int ship; // 段最大容纳战舰数
}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了,思路就这么多,上代码把:

#include <bits\stdc++.h>
using namespace std;
typedef long long ll; // 每一段
struct node{
int left; // 段的左端点
int right; // 段的右端点
int length; // 段长度
int ship; // 段最大容纳战舰数
}arr[];
int len = ; // 段的数量 int index[]; // 每一个点所处的段 int n,k,a,m;
int miss; // 每一次说miss的位置。 int sumShip = ; // 现阶段可容纳最多战舰数 // 获取某段可容纳最大战舰数量
int maxShip(node node1){
return (node1.length+)/(a+);
} //初始化
void init(){
arr[].left = ;arr[].right = n;
arr[].length = arr[].right - arr[].left + ;
arr[].ship = maxShip(arr[]);
sumShip = arr[].ship;
len = ;
} //更新段
void updataNode(int miss){
int con = index[miss]; // miss位置所在段
node* x = &arr[con]; //取出这个段
int shipNum = x->ship; arr[len].left = miss+;
arr[len].right = x->right;
arr[len].length = arr[len].right - arr[len].left + ;
arr[len].ship = maxShip(arr[len]);
replace(index+arr[len].left,index+arr[len].right+ , con ,len); // 将其中一部分所在段改变 x->right = miss-;
x->length = x->right - x->left + ;
x->ship = maxShip(*x); sumShip -= shipNum - arr[len].ship - x->ship; // 总容纳战舰数减少的数量等于分段后减少的战舰数量 len++;
} int main() { cin >> n >> k >> a >> m; init(); // 初始化 for(int i = ;i <= m; ++i){
cin >> miss;
updataNode(miss); // 更新段
if(sumShip < k){
cout << i << endl;
return ;
}
}
cout << - << endl;
return ;
}
//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. 题目1522:包含min函数的栈

    #include <iostream> #include <cstdio> #include <stack> using namespace std; int ma ...

  2. C#最佳工具集合:IDE、分析、自动化工具等

    C#是企业中广泛使用的编程语言,特别是那些依赖微软的程序语言.如果您使用C#构建应用程序,则最有可能使用Visual Studio,并且已经寻找了一些扩展来对您的开发进行管理.但是,这个工具列表可能会 ...

  3. poj 1986LCA离线dfs+并查集

    题意,给出边和权值,求出两个点间的最短距离. 用离线算法的时候有个地方不知道怎么处理了.在线的本来想用倍增的,但发现倍增算法貌似需要预处理深度而不是权值,不知道怎么处理.套一个rmq的模板吧,用来处理 ...

  4. 循环checked表单 元素

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

  5. POJ 3463 最(次)短路条数

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9497   Accepted: 3340 Descr ...

  6. (3)ES6解构赋值-对象篇

    对象的解构赋值(可以不按顺序,但是key必须一样否则为undefined) //demo1 var {name,age} = { name: "Jewave", age:26 }; ...

  7. 201521123083《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  8. 201521123107 《Java程序设计》第4周学习总结

    第4周作业-面向对象设计与继承 1.本周学习总结 2.书面作业 1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 对类的注释: 所得到的效果: ...

  9. Java学习6——基本数据类型及其转换

    Java常量: Java的常量值用字符串表示,区分不同的数据类型 整型常量123.浮点型常量3.14.字符常量'a'.逻辑常量true.字符串常量"helloworld". ps: ...

  10. 201521123121 《JAVA程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...