抢气球
这道题目的主要思路:
1.开struct
(一)因为题目要求老师让跳的低的小朋友先摘而且最后还要按着题目给的顺序输出(前面的那个要求需要用sort但后面需要按原顺序输出但不能sort回去)十分坑爹所以要用strcut
(二)这里如果用一个数组 来纪录 这个数是第几个小盆友,就会因为要用a来做下标 得开很大(开很大→爆炸),这里可以用map <int ,int> 做映射,但是还是struct简单容易理解。
(三)当然因为二分是在有序情况下进行的就得sort , sort又不能保证最后按照题目给的a顺序输出,这是另外一个原因。
1 struct point{ 2 int id;//小盆友的序号 3 int h;//小盆友能够着的高 4 int number;//小盆友摘到的气球 5 };
2.按id输入x
3.按x排point(因为是结构体无法直接排序所以要有cmph和cmpid)
int cmpid(point a,point b) { return a.id<b.id; }
4.遍历数组挨个二分得到number
5.按id排point(与3同理)
int cmph(point a,point b) { return a.h<b.h; }
6.输出n
剩下的只有二分模板和程序了:
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct point{ 4 int id; 5 int h; 6 int number; 7 }; 8 point a[100009]; 9 int n,m,h[100009]={0}; 10 int cmph(point a,point b) 11 { 12 return a.h<b.h; 13 } 14 int cmpid(point a,point b) 15 { 16 return a.id<b.id; 17 } 18 int main() 19 { 20 scanf("%d%d",&n,&m); 21 for(int i=1;i<=n;i++) 22 { 23 scanf("%d",&a[i].h); 24 a[i].id=i; 25 } 26 for(int i=1;i<=m;i++) scanf("%d",&h[i]); 27 sort(a+1,a+1+n,cmph); 28 sort(h+1,h+1+m); 29 int g=0; 30 for(int i=1;i<=n;i++) 31 { 32 int r=m+1,l=0; 33 while(l+1!=r) 34 { 35 int mid=(l+r)/2; 36 if(a[i].h>=h[mid]) l=mid; 37 else r=mid; 38 } 39 a[i].number=l-g; 40 g=l; 41 } 42 sort(a+1,a+1+n,cmpid); 43 for(int i=1;i<=n;i++) printf("%d\n",a[i].number); 44 return 0; 45 }