烦恼的高考志愿

 

 道题目就是二分而已,大体都一样,只是有一个小细节值得注意,在后面ans累加时需要分几种情况:

1.b[i]<=a[1],说明这个童鞋没好好复习,挂科了。

2.b[i]>=a[n],说明这个童鞋是个学霸。

3.else情况,说明这个童鞋不像前面两个童鞋不是挂科就是实力爆表,是个普通人。

程序:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,a[101000],b[101000]; 
 4 int main()
 5 {
 6     cin>>n>>m;
 7     for(int i=1;i<=n;i++) cin>>a[i];
 8     for(int i=1;i<=m;i++) cin>>b[i];
 9     sort(a+1,a+n+1);
10     int ans=0;
11     for(int i=1;i<=m;i++)
12     {
13         int r=n+1,l=0;
14         while(l+1!=r)
15         {
16             int mid=(l+r)/2;
17             if(a[mid]<=b[i])
18             {
19                 l=mid;
20             }
21             else
22             {
23                 r=mid;
24             }
25         }
26         if(b[i]<=a[1]) ans+=a[1]-b[i];
27         else if(b[i]>=a[n]) ans+=b[i]-a[n];
28         else ans+=min(abs(b[i]-a[l]),abs(a[r]-b[i]));
29     } 
30     cout<<ans;
31     return 0;
32 }

 

posted @ 2022-04-24 18:23  王浩泽  阅读(102)  评论(0)    收藏  举报