A. Reorder the Array (二分变形)
Posted -ackerman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A. Reorder the Array (二分变形)相关的知识,希望对你有一定的参考价值。
题目链接:http://codeforces.com/problemset/problem/1007/A
题目大意:就是给出长度为n的序列(a[i]),让你对它进行重新排序(b[i]),使b[i]>a[i] 的数目最多
思路:
二分就是了,找到第一个大于key的就是最完美的选择(但是要注意如果选过的不能在选) 算是二分查找的一种变形吧
AC代码:
1 #include <cstdio> 2 #include <string> 3 #include <iostream> 4 #include <algorithm> 5 #include <cstdbool> 6 #include <string.h> 7 #include <math.h> 8 9 10 using namespace std; 11 12 const int maxn = 1e5+5; 13 int a[maxn],b[maxn]; 14 int vis[maxn]= 0; 15 16 int binarySearch(int b[],int vis[],int n,int key) 17 18 int left = 0,right = n-1; 19 while (left <= right) 20 21 int mid = (right + left) / 2; 22 if (b[mid] > key) 23 right = mid - 1; 24 else 25 left = mid + 1; 26 27 while (vis[left]!=0 && b[left] > key) 28 left++; 29 if (b[left] <= key) 30 return -1; 31 else 32 vis[left]++; 33 return left; 34 35 36 37 38 39 int main() 40 41 int n,cnt = 0; 42 cin >> n; 43 for (int i=0;i<n;i++) 44 45 cin >> a[i]; 46 b[i] = a[i]; 47 48 sort(b,b+n); 49 for (int i=0;i<n;i++) 50 51 int ant = binarySearch(b,vis,n,a[i]); 52 if (ant >= 0) 53 cnt++; 54 55 printf("%d\n",cnt); 56 return 0; 57
以上是关于A. Reorder the Array (二分变形)的主要内容,如果未能解决你的问题,请参考以下文章