hihoCoder#1128 二分·二分查找

原题地址

一开始没搞懂题目是想干什么,于是写了一个扫一遍的代码,A了,如下:

代码:

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 int main() {
 6   int N, K, a;
 7   bool found = false;
 8   int lt = 0;
 9
10   scanf("%d%d", &N, &K);
11   for (int i = 0; i < N; i++) {
12     scanf("%d", &a);
13     if (a == K)
14       found = true;
15     if (a < K)
16       lt++;
17   }
18   printf("%d\n", (found ? lt + 1 : -1));
19
20   return 0;
21 }

做到后面一题的时候才明白题目是什么意思,代码如下:

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 #define SIZE 100000
 6
 7 int N, K;
 8 int a[SIZE];
 9
10 int ltc(int left, int right) {
11   if (left >= right)
12     return 0;
13
14   int l = left;
15   int r = right;
16   int p = a[left];
17
18   while (l < r) {
19     while (l < r && a[r] > p)
20       r--;
21     a[l] = a[r];
22     while (l < r && a[l] < p)
23       l++;
24     a[r] = a[l];
25   }
26   a[l] = p;
27
28   if (a[l] == K)
29     return l - left;
30   else if (a[l] < K)
31     return l - left + 1 + ltc(l + 1, right);
32   else
33     return ltc(left, l - 1);
34 }
35
36 int main() {
37   bool found = false;
38
39   scanf("%d%d", &N, &K);
40   for (int i = 0; i < N; i++) {
41     scanf("%d", &(a[i]));
42     found |= (a[i] == K);
43   }
44
45   printf("%d\n", (found ? ltc(0, N - 1) + 1: -1));
46
47   return 0;
48 }
时间: 2024-12-27 17:21:43

hihoCoder#1128 二分·二分查找的相关文章

hihoCoder 1128 二分查找

Description Input and Output Codes 描述#1128 : 二分·二分查找 Description Nettle最近在玩<艦これ>,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位).去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船.每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高. Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的.如果是重复的,那么这

#1128 : 二分&#183;二分查找 ( 两种方法 先排序在二分O(nlogN) + 直接二分+快排思想O(2N) )

#1128 : 二分·二分查找 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Nettle最近在玩<艦これ>,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位).去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船.每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高. Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的.如果是重复的,那么这艘船在Nettle所

hiho week 37 P1 : 二分&#183;二分查找之k小数

P1 : 二分·二分查找之k小数 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的 船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了.所以Nettle不得不把其中一艘船拆掉来让位给新的船.Nettle思考了很久, 决定随机选择一个k,然后拆掉稀有度第k小的船. 已知

hiho#1133 : 二分&#183;二分查找之k小数

#1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了.所以Nettle不得不把其中一艘船拆掉来让位给新的船.Nettle思考了很久,决定随机选择一个k,然后拆掉稀有度第k小的船. 已知每一艘船都有自己的稀有度,Nettle现在把所有

hiho week 38 P1 : 二分&#183;二分答案

P1 : 二分·二分答案 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上一回和上上回里我们知道Nettle在玩<艦これ>,Nettle在整理好舰队之后终于准备出海捞船和敌军交战了.在这个游戏里面,海域是N个战略点(编号1..N)组成,如下图所示其中红色的点表示有敌人驻扎,猫头像的的点表示该地图敌军主力舰队(boss)的驻扎点,虚线表示各个战略点之间的航线(无向边).在游戏中要从一个战略点到相邻战略点需要满足一

hihocoder 第三十六周 二分&#183;二分查找

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Nettle最近在玩<艦これ>,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位).去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船.每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高.Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的.如果是重复的,那么这艘船在Nettle所有的船里面稀有值排多少位. 问题一

hihoCoder#1133 二分&#183;二分查找之k小数

原题地址 经典问题了,O(n)时间内找第k大的数 代码: 1 #include <iostream> 2 3 using namespace std; 4 5 int N, K; 6 int *a; 7 8 int search(int left, int right, int k) { 9 if (left > right) 10 return -1; 11 int l = left; 12 int r = right; 13 int p = a[left]; 14 while (l

POJ - 2785 - 4 Values whose Sum is 0 - 二分折半查找

2017-08-01 21:29:14 writer:pprp 参考:http://blog.csdn.net/piaocoder/article/details/45584763 算法分析:直接暴力复杂度过高,所以要用二分的方法,分成两半复杂度就会大大降低: 题目意思:给定4个n(1<=n<=4000)元素的集合 A.B.C.D ,从4个集合中分别选取一个元素a, b,c,d.求满足 a+b+c+d=0的个数 代码如下: //首先将前两列任意两项相加得到数组x,再将后两列任意两项相加取反得到

ACM学习历程—Hihocoder 1139 二分&#183;二分答案(bfs)

http://hihocoder.com/problemset/problem/1139 这题提示上写的是二分,但是感觉不二分应该也可以,至少题目是AC的... 二分的思想就是二分答案的值,看能不能在k步内,得到这个答案值,可以采用bfs来判定. 不二分的话,就是需要一个dis[]数组来保存在前k步内,每个点的最小索敌值,因为bfs在往后的过程中step是越来越大的,所以前面能达到更小的,显然不会重复再跑大的,然后bfs的过程中更新即可.类似于spfa,但是没有对队列去重. 代码: #inclu