前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯官网 试题 PREV-109 历届真题 扫地机器人【第十届】【省赛】【研究生组】【C++】【Java】【Python】三种解法

蓝桥杯官网 试题 PREV-109 历届真题 扫地机器人【第十届】【省赛】【研究生组】【C++】【Java】【Python】三种解法

作者头像
红目香薰
发布2022-11-30 17:11:16
2890
发布2022-11-30 17:11:16
举报
文章被收录于专栏:CSDNToQQCode

为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。

今年的最大目标就是能为【一亿技术人】创造更高的价值。


资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

C++

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
const int maxx=1e5+10;

int n,k,a[maxx];

bool check(int x)
{
	int R=0;
	for(int i=0;i<k;i++)
	{
		if(a[i]-x>R)
		return false;
		else
		{
			if(a[i]<=R)
			R=a[i]+x-1;
			else
			R+=x;
		}
	}
	return R>=n;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>k;
	for(int i=0;i<k;i++)
	cin>>a[i];
	
	sort(a,a+k);
	int L=0,R=n;
	while(L<R)
	{
		int mid=(L+R)>>1;
		if(check(mid))
		R=mid;
		else
		L=mid+1;
	} 
	cout<< (L-1)*2 <<endl;
	return 0;
}

Java

代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;

public class Main {//本题非常有意思,是一个典型的二分使用
	//简单来说就是本题使用二分来查找满足要求的机器人清扫范围
	//穷举出满足要求的范围,然后继续缩小,最后留下的就是最小范围,而因为要回到原位,就是x-1的两倍
	//其中检验符不符合要求,就是去模拟整个过程,最后长度可以达到n,就说明满足要求
	//不能到达说明x太小,能到可能满足或者太大,指针向后移
	//一个二分的妙用,让暴力又有了一个新方法,我认为很完美
	static int aa[],n,m;
	public static void main(String[] args) throws IOException {
		StreamTokenizer x = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
		x.nextToken();
		n=(int)x.nval;
		x.nextToken();
		m=(int)x.nval;
		aa=new int[m];
		for(int i=0;i<m;i++) {
			x.nextToken();
			aa[i]=(int)x.nval;
		}
		Arrays.sort(aa);
		int beg=0,end=n,mid,bj=0;
		while(beg<=end) {
			mid=(beg+end)>>1;
		if(check(mid)) {
			bj=mid;
			end=mid-1;
		}
		else {
			beg=mid+1;
		}
		}
		out.println((bj-1)*2);
		out.flush();
	}
	public static boolean check(int x) {
		int t=0;
		for(int i=0;i<m;i++) {
			if(aa[i]-x<=t) {
				if(aa[i]<=t)
					t=aa[i]+x-1;
				else
					t+=x;
			}
			else
				return false;
		}
		return t>=n;
	}
}

Python

代码语言:javascript
复制
def judge(m,q):
   for i in range(k):
       if (a[i]-q) <= m:
           if a[i]<= m:
               m = a[i] + q -1
           else:
               m = a[i] + q -(a[i] - m)
       else:
           return 0
   if m < n:
       return 0
   return 1
n,k = map(int,input().split())
a=[0]*k
for i in range(k):
   a[i]=int(input())
a.sort()
if (n/k) >=a[0]:
   q = int(n/k)
else:
   q = a[0]
 
for i in range(q,n+1):
   m = 0
   if judge(m,i)==1:
       print(2 * (i - 1))
       break
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++
  • Java
  • Python
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档