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

举报
红目香薰 发表于 2022/06/26 20:02:11 2022/06/26
【摘要】 ​ 为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。今年的最大目标就是能为【一亿技术人】创造更高的价值。资源限制内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s​编辑​编辑C++#include<bits/stdc++.h>using nam...

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


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


资源限制

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

编辑编辑

C++

#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

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

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


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。