jzoj:【综合测试4】摘苹果(apple)

题外话

蒟蒻一枚…(坐在马桶上都能看懂的题解)

穿越

这一道题难度还行吧,至少没有普及提高那么难(QwQ)
在这里,吾放一下样例

样例输入1
3 2
5 3 6
4 6

样例输出1
11


样例输入2
3 3
4 2 3
3 3 4

样例输出2
Bad luck

难度:⭐⭐

方法:很多

数据范围限制

对于100%的数据,1<=N,M<=1000,1<=Hi,Pi<=1000。

法一:暴力判断 (分数20分左右)

时间复杂度:O(n)

#include
using namespace std;
int flag,a[10000],b[10000];
int main()
{
	int n,m,sum=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	for(int i=1;i<=n;i++)
		if(a[i]>=b[i]&&b[i]-a[i]<a[i])
			sum=sum+a[i];
		else
			cout<<"Bad luck"<<endl,flag=1;
	if(!flag) cout<<sum;
	return 0;
}

这只是个初步的大小判断,其实这个代码改一改是差不多能AC的,因为数据太水了…

jzoj:【综合测试4】摘苹果(apple)_第1张图片

法二:暴力判断的升级

上面的那一个代码sort一下,再多一层for循环判断,也许这一道题 基本就AC了

代码:


......不显示了吧......

法三:进阶(AC)其实也有O(n*m)的,就是不sort的,不过不想讲了…

时间复杂度:O(n+m)
输入、排序和上面的一样。

  • 输入
  • 排序、从小到大排
  • 外层一个1~m的循环,一个个找
  • 里面一个1~n的循环,一个个匹配
  • 判断跳的高度是否比苹果高度高,如果高的话就是最优解(请读者想一想为什么),否则继续
  • 如果找到一个高点了要标记一下,下一次就用这个点的下一个点来找(想想有何用意吧)
  • 摘下的苹果数加一,为的是等一下看有没有全部摘下来
  • 找到了一个高点后直接break,因为每个点只需一个小朋友摘就行
  • 输出
  • 结束

给个关键的图吧

jzoj:【综合测试4】摘苹果(apple)_第2张图片

也许你们会问:上面那个方法不已经行了嘛,搞这么多干嘛?

首先:上面那个存在风险,容易错

第二:我们来看一看这一道题:

穿梭于知识的海洋之中

没啥变化啊?

关键看这个:

上题:
jzoj:【综合测试4】摘苹果(apple)_第3张图片
这题:
jzoj:【综合测试4】摘苹果(apple)_第4张图片

. . . . . . . . . . . . . . . . . . . 华丽的分界线 . . . . . . . . . . . . . . . . . . . . .

OK,这一次就先讲到这里了,有问题私聊吧!

(如果对你有好处,请点个赞,谢谢)

你可能感兴趣的:(思维题)