Medusa同学拿到了2组数字,老师请你编程帮他找出,第2组数中的哪些数,在第1组数中出现了,从小到大输出所有满足条件的数。
比如:
第1组数有:8 7 9 8 2 6 3
第2组数有:9 6 8 3 3 2 10
那么应该输出:2 3 3 6 8 9
第一行两个整数n和m,分别代表2组数的数量
第二行n个正整数
第三行m个正整数
对于60%的数据1≤n,m≤1000,每个数<=2*10^9
对于100%的数据1≤n,m≤100000,每个数<=2*10^9
按照要求输出满足条件的数,数与数之间用空格隔开
7 7
8 7 9 8 2 6 3
9 6 8 3 3 2 10
2 3 3 6 8 9
/**
while循环条件写错
变量名不要写错
输入写错 静态存储区
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000100],b[1000100];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
sort(a+1,a+1+n);
sort(b+1,b+1+m);
/*
1定义左指针l=1 右指针r=n mid
2.while l<=r mid赋值 结束条件 l>r
3.判断指针左移还是右移 开始二分查找
*/
for(int i=1;i<=m;i++){
int x = b[i];
int l=1,r=n,mid;
while(l<=r){
mid = l+r>>1;
if(x>a[mid]){
l=mid+1;
}else if(x<a[mid]){
r=mid-1;
}else if(x==a[mid]){
cout<<x<<" ";
break;
}
}
}
return 0;
}
高考结束了,同学们要开始了紧张的填写志愿的过程,大家希望找一个自己最满意的大学填报方案,请你编程帮忙实现。 现有 m(m≤100000) 所学校,每所学校预计分数线是 ai(ai≤10^6) 。有 n(n≤100000) 位学生,估分分别为 bi(i≤10^6)。根据 n 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。
第一行读入两个整数 m,n,m 表示学校数, n 表示学生数。
第二行共有 m 个数,表示 m 个学校的预计录取分数。
第三行有 n 个数,表示 n 个学生的估分成绩。
一行,为最小的不满意度之和。(数据保证计算结果≤10^9)
4 3
513 598 567 689
500 600 550
32
#include<bits/stdc++.h>
using namespace std;
int n,m,num[1000100],x,jishu;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>num[i];
}
sort(num+1,num+n+1);
for(int i=1;i<=m;i++){
cin>>x;
if(x>=num[n]){
jishu+=x-num[n];
}else if(x<=num[1]){
jishu+=num[1]-x;
}else{
int l=1,r=n,mid;
while(l<=r){
mid=l+(r-l)/2;
if(x>num[mid]){
l=mid+1;
}else if(x<num[mid]){
r=mid-1;
}else if(x==num[mid]){
r=mid-1;
}
}
int a = num[l]-x;
int b = x-num[r];
if(a>b){
jishu+=b;
}else{
jishu+=a;
}
}
}
cout<<jishu;
return 0;
}
在一个非降序列中,查找与给定值最接近的元素。
第一行包含一个整数n,为非降序列长度。1 ≤ n ≤ 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 ≤ m ≤ 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
3
2 5 8
2
10
5
8
5
#include <bits/stdc++.h>
using namespace std;
long long n, m,x;
int a[1000100];
int main(){
cin>>n;
for(int i=1;i<=n;i++) {
cin>>a[i];
}
cin>>m;
// sort(a+1,a+1+n);
for(int i=1;i<=m;i++) {
cin>>x;
if(x>=a[n]){
cout<<a[n]<<endl;
}else if(x<=a[1]) {
cout<<a[1]<<endl;
}else {
int *p = upper_bound(a+1,a+1+n,x);
int q = a[p-a]-x;
int w = x-a[p-a-1];
// cout<<"q="<<q<<" w="<<w<<endl;
if (q>=w) {
cout<<a[p-a-1]<<endl;
}else {
cout<<a[p-a]<<endl;
}
}
}
return 0;
}