课上洛谷刷题第二天

5 篇文章 0 订阅
2 篇文章 0 订阅

今天,主讲老师有事去了,换了个代课老师来上课。

但是有些同学这就开始八卦了起来:

本来这个班的主讲老师并不是现在的主讲老师的,可是原来的主讲老师有事,找了个代课老师来上课。

第二节课,同学们依然没有见到他们的主讲老师代课老师说他去谈恋爱不知道干嘛了,自己就变成了主教老师

而这节课主教老师又有事去了,会不会也是去谈恋爱不知道干嘛了呢?

咳咳,回归正题。

代课老师今天又让我们做二分。

首先是第一题:洛谷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!!!!!!

对不起对不起,爆了点粗口。。。

好啦,今天的刷题课堂就结束了,我们下次再见!

对了,下次再见可能要很久了。。。

话说主教老师是和谁谈啊?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值