题目链接: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 ",cnt); 56 return 0; 57 }