记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <bits/stdc++.h>
bool turn(int a,int b);
using namespace std;
int main(){
int n,m;scanf("%d %d",&n,&m);
int b[n],a[m];
long long sum=0;
for (int i=0;i<n;i++)scanf("%d",&b[i]);
for (int i=0;i<m;i++)scanf("%d",&a[i]);
sort(b,b+n,turn);
for (int i=0;i<m;i++){
if (a[i]>b[n-1]){ //******A
sum+=a[i]-b[n-1];
continue;
}
if (a[i]>b[0]) //*******B
sum+=min(*lower_bound(b,b+n,a[i])-a[i],a[i]-*(lower_bound(b,b+n,a[i])-1));
else
sum+=b[0]-a[i];
}
printf("%lld",sum);
return 0;
}
bool turn(int a,int b){
return a<b;
}
总结:
1.upper_bound和lower_bound函数,如果查找值大于数组的最大值,则返回的指针指向输入值
2.额外样例会爆int 注意啦注意啦注意啦注意啦 long long,ll祖宗
3.考虑特殊情况啊啊啊,一个学校时候,第一个值同时是最后一个值,注意,所以使用upper_bound会出错,第三组样例,改之前一直wa,改成low_er就行了
就是******标记处,如果只有一个元素,且执行B,会越界
4.以后要考虑特殊情况,注意为0,为1等等等等