SCAU 18725 宇宙跃迁

这个是搜到的二分做法 顺便附上我的不知道哪里错了的做法 大家有兴趣看着乐呵乐呵就行(大家写题还是按照oj上的标签方法写吧)

#include<iostream>
using namespace std;
int a[10005],n,k;
bool judge(int x)//判断能力x能否使飞船在k天内到达首都 
{
//	cout<<"x"<<x<<endl;
	int i,cur_day=0,pre_pos=0;
	for(i=1;i<=n&&cur_day<=k;i++)
	{
		if(a[i]-a[i-1]>x)
		return false;
		if(x>=a[i]-pre_pos)//当前能力可以走到a[i],看看能不能走到下一个 
		continue;
		else
		{
			cur_day++;//时间增加一天 
			pre_pos=a[i-1];
		//	cout<<"pre_pos"<<pre_pos<<endl;
			i--;//回退 
		}
	}
	cur_day++;//防止最后位置的时间没有加上 
	return cur_day<=k;//判断 
}
int main()
{
	ios::sync_with_stdio(false);
	int i;
	cin>>n>>k;
	for(i=1;i<=n;i++)
	cin>>a[i];
	int low=1,high=a[n],middle,best=a[n];
	while(low<=high)
	{
		middle=(low+high)/2;
		if(judge(middle))
		{
			best=middle;//记录跃迁能力 
			high=middle-1;//看看是否还有更小的跃迁能力也可以使其成立 
		}
		else
		{
			low=middle+1;
		}
	}
	cout<<best;
	return 0;
}

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

/*在基地的科学家发明“透镜”之后,宇宙航行变得更加效率。
作为基地元首的的代理人,你需要在K天内乘坐飞船到达首都川陀。
飞船可以花费一天时间,通过迁跃从一个星系到达另一个星系,但绝不能迁跃到星系之间,那样不但会遇到一些自然危险,也可能永远迷失。
我们把基地至川陀间星系的坐标看成是一个线性序列,例如a星系坐标是10,b星系坐标是15,那么飞船必须具备不小于5的迁跃能力才能从a航行至b。
基地坐标为0,请你根据基地至川陀间的N个星系坐标,计算飞船的迁跃能力至少为多大,才能在K天内(包含K天)到达川陀。
输入格式
第一行两个整数N和K。(1=<N<=10000,1=<K<=10000)
第二行N个整数,表示N个星系的坐标ai,题目确保坐标由小到大排列。(0=<ai<=100000)

输出格式
仅一行,飞船的最小迁跃能力。

输入样例
5 2
1 4 6 10 19

输出样例
10*/
int N,K,oneday;
int a[100001];//每个星系的坐标
int b[100000];//每个星系之间的距离
//不知道哪错了 看出来的大佬指导一下
int main()
{
    cin>>N>>K;
    for(int i=0;i<N;i++)
        scanf("%d",&a[i]);
    for(int i=0;i<N-1;i++)
        b[i]=a[i+1]-a[i];
    sort(b,b+N-2);//最后一个一定为距离的最大值
    for(oneday=0;oneday<=a[N-1];oneday++)
    {
        int ans=oneday*K;
        if(oneday>=b[N-2]&&ans>=a[N-1]) break;//答案有两个条件 一是大于每个星系间的最大间隙 二是在规定天数内能够到达
    }
    cout<<oneday;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值