51nod——1521一维战舰 利用二分法
2016-10-22 12:15
260 查看
一、原题链接
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1521
二、思路解析
这道题的意思应该很好理解,就不再说题意问题了。
现在告诉你那些位置没有被占,那么我们可以知道这时是不是能放下k个战舰,方法就是计算这种情况下最多能放多少个战舰,然后和k进行比较。代码中的ok函数就是完成这个工作的,参数p的意思是:已知x1,x2,……,xp没有被占取,是否能放下所有战舰。我们可以让p从1到m进行遍历,如果发现不能满足,那么输出就是p-1,如果p=1时就不能满足,那么输出-1。这个算法很简单,但是时间复杂度是O(m^2),m最大的取值到2*10^5,所以肯定会超时的。为了降低时间复杂度,我们可以在选择p的时候采用二分方式,这样时间复杂度就降到O(m*logm)了。
三、c语言代码
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1521
二、思路解析
这道题的意思应该很好理解,就不再说题意问题了。
现在告诉你那些位置没有被占,那么我们可以知道这时是不是能放下k个战舰,方法就是计算这种情况下最多能放多少个战舰,然后和k进行比较。代码中的ok函数就是完成这个工作的,参数p的意思是:已知x1,x2,……,xp没有被占取,是否能放下所有战舰。我们可以让p从1到m进行遍历,如果发现不能满足,那么输出就是p-1,如果p=1时就不能满足,那么输出-1。这个算法很简单,但是时间复杂度是O(m^2),m最大的取值到2*10^5,所以肯定会超时的。为了降低时间复杂度,我们可以在选择p的时候采用二分方式,这样时间复杂度就降到O(m*logm)了。
三、c语言代码
#include <stdio.h> #include <stdlib.h> struct lie { int id; int ord; }; struct lie x[200005]; int n, k, a, m; int cmp(const void *a,const void *b) { return ((struct lie*)a)->id - ((struct lie*)b)->id; } int ok(int p) //判断前p个询问发生完,是否可以判定为说谎:说谎0,没说谎1 { int i, b=0, s=0; for(i=0;i<m;i++) { if(x[i].ord<=p) { s += (x[i].id - b) / (a+1); b = x[i].id; } } s += (n+1 - b) / (a+1); if(s>=k) return 1; else return 0; } int main() { int i, low, high, mid, ans; //读入数据 scanf("%d%d%d%d", &n, &k, &a, &m); for(i=0;i<m;i++) { scanf("%d", &x[i].id); x[i].ord = i+1; } //排序 qsort(x, m, sizeof(struct lie), cmp); //用二分方式尝试 low = 1; high = m; ans = -1; while(low<=high) { mid = (low+high)/2; if(ok(mid)) { low = mid+1; } else { ans = mid; high = mid-1; } } //输出结果 printf("%d", ans); return 0; }
相关文章推荐
- 51Nod 1521 一维战舰
- 51Nod 1521 一维战舰
- 51NOD 1521 一维战舰
- 51nod 1521 一维战舰
- 51nod 1521 一维战舰
- 51nod 1521 一维战舰 模拟
- 51nod 1521 一维战舰
- 【CodeForces】567D - One-Dimensional Battle Ships & 【51Nod】1521 - 一维战舰(STL - set & 二分)
- 51nod-【1521 一维战舰】
- 51Nod-1521-一维战舰
- 51nod 1521 一维战舰【set】
- 51nod 1521 一维战舰
- 51 NOD 1521 一维战舰(并查集)
- 1521 一维战舰 水题
- 51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释
- 51 Nod 1521 一维战舰
- 利用数组和for循环给一维数组内n个元素大小排序
- ACM:二分查找,以及利用二分法来找上下界
- 利用递归把多维数组转为一维数组的函数
- <java>利用简单一维数组完成信息的增删改查