18725 宇宙迁跃
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC
Description
在基地的科学家发明“透镜”之后,宇宙航行变得更加效率。
作为基地元首的的代理人,你需要在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
提示
样例说明:川陀的坐标为最后一个值19。
飞船的迁跃能力至少为10,才能在2天内到达川陀。
思路:
1.二分法
2.建立一个distanc数组存储星系之间距离,也就是飞船跨越每个星系要飞行的距离,然后二分法找到符合条件的跃迁能力power,power相当于能量,每到达一个星系能量相应减少,直至为0,此时飞船必须停落在星系上,等待第二天飞行,即天数加1。循环之后,看天数是否满足要求。
代码:
#include<iostream>
using namespace std;
int ai[10005]={0}, distanc[10005];//ai表示迁跃能力,distanc指星系之间距离
int n, k, max1 = 0;//max1指最大距离
int check(int power)
{
int day = 0;
if (max1 > power)return 0;
int powert = power;//power在之后会用到,为了不影响power的值,这里将power值赋给powert
for (int i = 0;i <n;i++)
{
powert = powert - distanc[i];
if (powert >=0)continue;//如果能量够用,继续飞往下一个星系
//能量不够用
day++;//天数增加
powert = power;//恢复能量
i=i-1;//在能量耗尽前必须到达一个星系
}
day++;// cout << powert<<" "<<day << endl;
return day <= k;
}
int main()
{
cin >> n >> k;
//初始化
for (int i = 1;i <= n;i++)
{
cin >> ai[i];
distanc[i - 1] = ai[i] - ai[i - 1];//存储相邻星系距离
if (max1 < distanc[i-1])max1 = distanc[i-1];//记录相邻两星系距离最大值
}
//二分法
int l = 1, r = 1e9;
int mid, best = 0;
while (l <=r)
{
mid = (l + r) / 2;
if (check(mid)) { best = mid;r = mid - 1; }
else l = mid + 1;
}
cout << best;
return 0;
}
新手小白,有问题欢迎大佬指正