今天,主讲老师有事去了,换了个代课老师来上课。
但是有些同学这就开始八卦了起来:
本来这个班的主讲老师并不是现在的主讲老师的,可是原来的主讲老师有事,找了个代课老师来上课。
第二节课,同学们依然没有见到他们的主讲老师,代课老师说他去谈恋爱不知道干嘛了,自己就变成了主教老师。
而这节课主教老师又有事去了,会不会也是去谈恋爱不知道干嘛了呢?
咳咳,回归正题。
代课老师今天又让我们做二分。
首先是第一题:洛谷1571:眼红的Medusa
地址放这,想看跳转一下https://www.luogu.com.cn/problem/P1571
这题思路大致是这样的:
先遍历查找第一个数组,再在第二个数组里面二分查找与第一个数组相同的元素,如果找到了就输出
切记,必须sort一下第二个数组,否则二分不了
但是,第一个数组就没必要sort了,因为是直接遍历的。
上第一次CE代码
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
long long a[100001]={0},b[100001]={0};
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
for(int j=0;j<m;j++) cin>>b[j];
sort(b,b+m);
for(int i=0;i<n;i++){
int l=0;r=m-1;
while(r-l>=1){
int mid=(l+r)/2;
if(a[i]<b[mid]) r=mid-1;
else if(a[i]>b[mid]) l=mid+1;
else{cout<<a[i]<<' ';break;}
}
}
return 0;
CE原因:main函数括号有前无后
再上“稻花香里说丰年,听取WA声一片”之代码
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
long long a[100001]={0},b[100001]={0};
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
for(int j=0;j<m;j++) cin>>b[j];
sort(b,b+m);
for(int i=0;i<n;i++){
int l=0,r=m-1;
while(r-l>1){
int mid=(l+r)/2;
if(a[i]<b[mid]) r=mid-1;
else if(a[i]>b[mid]) l=mid+1;
else{cout<<a[i]<<' ';break;}
}
}
return 0;
}
错误原因我先不说,等会你对比一下AC代码
//AC
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
long long a[100001]={0},b[100001]={0};
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
for(int j=0;j<m;j++) cin>>b[j];
sort(b,b+m);
for(int i=0;i<n;i++){
int l=0,r=m-1;
while(r>=l){
int mid=(l+r)/2;
if(a[i]<b[mid]) r=mid-1;
else if(a[i]>b[mid]) l=mid+1;
else{cout<<a[i]<<' ';break;}
}
}
return 0;
}
如果你能在半分钟内找到两者之区别,你应该能进那江苏某综艺频道——————《最强大脑》了,指不定还能为中国再度获得脑王奖杯
第十四行,l也能等于r啊!!!!!!!!!!!
冷静,冷静。。。。。。
接着就是第二题,也是今日刷题最后一题1678 烦恼的高考志愿
所以题目背景是认真的的吗?
题目提供者洛谷,身后还有一群小姑娘等着和他约会
说明洛谷的创作者是个渣男!!!
好啦,来分析一下这道题。
不满度最小是什么啊?就是temp=a-lower_bound(a,a+m,b[i]);然后不满度=min(abs(a[temp]-b[i]),abs(a[temp-1]-b[i]));
这里用了lower_bound,表示的是a[0]到a[m-1]里第一个大于等于b[i]的地址,如果没有返回数组末地址。
顺便说下upper_bound,格式一样,意思只是大于等于变成了大于
上第一次WA代码
#include<bits/stdc++.h>
using namespace std;
int n,m,sum=0;
int a[100001],b[100001];
int main(){
cin>>m>>n;
for(int i=0;i<m;i++) cin>>a[i];
for(int j=0;j<n;j++) cin>>b[j];
sort(a,a+n);
for(int i=0;i<n;i++){
int temp=lower_bound(a,a+m,b[i])-a;
sum+=min(abs(a[temp]-b[i]),abs(a[temp-1]-b[i]));
}
cout<<sum;
return 0;
}
WA原因:两个特例。
特例一:当lower_bound返回数组末地址时,要特判
特例二:当a都是大于b[i]的,要特判
大神仙还别急着喷,先看完。
上第二次WA代码
#include<bits/stdc++.h>
using namespace std;
int n,m,sum=0;
int a[100001],b[100001];
int main(){
cin>>m>>n;
for(int i=0;i<m;i++) cin>>a[i];
for(int j=0;j<n;j++) cin>>b[j];
sort(a,a+m);
for(int i=0;i<n;i++){
int temp=lower_bound(a,a+m,b[i])-a;
if(a[temp]<b[i]){
sum+=(b[i]-a[temp]);
continue;
}
if(temp!=0) sum+=min(abs(a[temp]-b[i]),abs(a[temp-1]-b[i]));
else sum+=abs(a[temp]-b[i]);
}
cout<<sum;
return 0;
}
WA原因:特判1根本不需要
大神仙们现在舒服了吧。。。
上代码
#include<bits/stdc++.h>
using namespace std;
int n,m,sum=0;
int a[100001],b[100001];
int main(){
cin>>m>>n;
for(int i=0;i<m;i++) cin>>a[i];
for(int j=0;j<n;j++) cin>>b[j];
sort(a,a+m);
for(int i=0;i<n;i++){
int temp=lower_bound(a,a+m,b[i])-a;
if(temp!=0) sum+=min(abs(a[temp]-b[i]),abs(a[temp-1]-b[i]));
else sum+=abs(a[temp]-b[i]);
}
cout<<sum;
return 0;
}
AC了
怒气值:0%
怒气值:20%
怒气值:30%
怒气值:50%
怒气值:70%
怒气值:90%
怒气值:100%
What the f**k?Mo**erfu**er it!!!!!!
对不起对不起,爆了点粗口。。。
好啦,今天的刷题课堂就结束了,我们下次再见!
对了,下次再见可能要很久了。。。
话说主教老师是和谁谈啊?