计蒜客 程序设计:植物大战僵尸

  •  1000ms
  •  262144K

植物大战僵尸为近来很火的一款游戏。而这一次我们不一样,我们要提前养成植物然后来抵抗僵尸。

你的 nn 个植物已经从左到右排成了一排,编号从 11 到 nn,起始的时候,他们的防御都是 00,而你的任务就是来提高他们的防御。

你一共有 mm 天的时间进行备战,起始你在整个植物的最左边,每天你 必须 向左或向右移动一格,到达第 ii 棵植物的时候,你给这个植物增加 a_iai​ 点的防御。

众所周知,根据木桶原理,整排植物的防御取决于最低防御的一棵植物,你想让 mm 天以后的整排植物的防御力最高,请问最高能是多少呢?

输入格式

输入数据第一行包含以空格隔开的两个整数 n,mn,m,分别表示植物总数和你的备战天数。

第二行包含以空格隔开的 nn 个整数 a_1.a_2,\cdots,a_na1​.a2​,⋯,an​,表示每次一个植物可以增加的防御力。

输出格式

输出文件共一行包括一个整数,表示整排植物可以达到的最大防御力。

数据范围

#nnmma_iai​
1\sim31∼32\leq n \leq 102≤n≤100 \leq m \leq 200≤m≤201\leq a_i \leq 10^51≤ai​≤105
4\sim64∼62 \leq n \leq 1002≤n≤1000 \leq m \leq 1,0000≤m≤1,0001\leq a_i \leq 10^51≤ai​≤105
7\sim107∼102 \leq n \leq 10^52≤n≤1050 \leq m \leq 10^{12}0≤m≤10121\leq a_i \leq 10^51≤ai​≤105

样例输入复制

4 8
3 2 6 6

样例输出复制

6
#include<cstdio>

using namespace std;

const int N = 1e5 + 10;

typedef long long ll;

ll n,m;

ll num[N];

bool check(ll x)//判断当前防御力在m天内是否可行 
{
	ll last=0, now=0;//左右横跳对上一位置进行更改时,对当前位置造成的影响 
	ll sum = 0;
	for(int i=0; i<n; i++)
	{
		now = x/num[i] + (x%num[i] ? 1 : 0);//达到x值所需天数 
		now -= last;
		if(now > 0)//需要继续更改,则会对下一位置照成影响 
		{
			last = now - 1;
		}
		else
		{
			if(i == n-1) //到最后一个位置不需要继续移动 
			{
				now = 0;
				last = 0;
			}
			else
			{
				now = 1;//移动需要一天 
				last = 0;
			}
		}
		sum += now + last;
		if(sum > m) return 0;
	}
	return 1;
}

int main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=0; i<n; i++) scanf("%lld", &num[i]);
	ll l = 1, r = 1e18;
	ll mid;
	while(l < r)//二分寻找最大防御力 
	{
		mid = (l + r) >> 1;
		if(check(mid)) l = mid+1;
		else r = mid;
	}
	printf("%lld", l-1);
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值