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 }

 

你可能感兴趣的:(code)