3 条题解
-
1
so?
#include<bits/stdc++.h> using namespace std; int a[100005],b[100005],n,m,h; int main(){ cin>>m>>n; for(int i=1;i<=m;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ cin>>b[i]; } sort(a+1,a+m+1); for(int i=1;i<=n;i++){ int k=lower_bound(a+1,a+n+1,b[i])-a; if(k==1){ h+=abs(a[k]-b[i]); } else if(k==m+1){ h+=abs(a[m]-b[i]); } else{ h+=min(abs(a[k]-b[i]),abs(a[k-1]-b[i])); } } cout<<h; return 0; }
-
0
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int line[100005]; int main() { int m,n; cin>>m>>n; int t=0,k=0; while(t<m) { cin>>line[t]; t++; } sort(line,line+t);//以上是读入和排序分数线 int sum=0; while(k<n) { int num; cin>>num; k++; int L=0,R=t-1; int ans=1000;//最小的差的绝对值,初始化为一个比较大的值 while(L<=R)//终止条件 { int mid=(L+R)/2;//取中间值判断 if(line[mid]==num) { ans=0; break;//零必然为最小的所求解,所以可直接终止二分,节约时间 } else if(line[mid]<num) { ans=min(ans,abs(line[mid]-num)); L=mid+1;//可能的更好的答案在右边,右移,记录当前最优解,继续搜索 } else if(line[mid]>num) { ans=min(ans,abs(line[mid]-num)); R=mid-1;//可能的更好的答案在左边,左移,记录当前最优解,继续搜索 } } sum+=ans; } cout<<sum; }
-
0
#include #include using namespace std; int main() { int x,cn=0,m,a[100001],n,i,b[100001],l,r,mid; cin>>n>>m; for(i=1;i<=n;i++) cin>>a[i];//输入每个学校的录取分数线 sort(a+1,a+n+1);//快排,把所有学校录取分数线排序 for(i=1;i<=m;i++) cin>>b[i];//输入每个学生的估值 for(i=1;i<=m;i++) { l=1;r=n; while(l<r-1) { mid=(l+r)/2; if(b[i]>=a[mid]) l=mid; else r=mid; }//二分查找,找出学生估值所在那两个学校的录取分数线之间 x=abs(b[i]-a[l])<abs(a[r]-b[i])?abs(b[i]-a[l]):abs(a[r]-b[i]);//比与学生估值高的和低的两个学校的录取分数线进行相减取绝对值,作为该学生的不满意度 cn+=x;//计算不满意度总和 } cout<<cn;//输出 }
- 1
信息
- ID
- 5736
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 100
- 已通过
- 22
- 上传者