烦恼的高考志愿
道题目就是二分而已,大体都一样,只是有一个小细节值得注意,在后面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 }

浙公网安备 33010602011771号