每日一题之 hiho188 小Ho的防护盾

题目1 : 小Ho的防护盾
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星舰会以T(T为大于0的整数)个单位时间的间隔向小Ho的城市轰击。歼星舰总共有N枚炮弹,其中第i枚会造成Ai点伤害值。

幸好小Ho的城市有K层护盾,每层护盾可以抵挡M点伤害。当某次轰击使得伤害值达或超过M时,该层护盾就会被击碎;该次轰击溢出的伤害不会作用于下一层护盾;下一次轰击将由下一层护盾承受。

同时,受损但尚未被击碎护盾会以每单位时间减少1点伤害值的速度修复自己,直到伤害值降为0。这就意味着小Hi的攻击间隔T越大,小Ho撑过这N枚炮弹的可能性就越大。

那么问题来了,小Hi的攻击间隔T至少需要是多少,小Ho城市的防护护盾才能不被全部击破?

为了使题目不存在歧义,规定:

小Hi的第i次攻击发生在时刻(i-1)*T

小Ho的第i次修复发生在时刻i-0.5

输入
第一行包含3个整数N、M和K,意义如前文所述。

第二行包含N个整数A1 - AN,表示小Hi第i枚炮弹的伤害值。

对于30%的数据,满足N<=100

对于100%的数据,满足1<=N<=100000

对于100%的数据,满足1<=K<=10, 1<=Ai, M<=100000

输出
输出使得小Ho城市的防护护盾不被全部击破的小Hi攻击间隔的最小值。如果不存在这样的T,则输出-1。

样例输入
3 5 1
3 3 3
样例输出
3

思路:从题目来看只要时间间隔够长,那么可以保证防护盾不被破坏,关键在于如何找到一个T值使得恰好防护盾不被全部破坏,那么可以二分枚举这个T值。每次判断当前的T是否可以满足条件。直到找到最合适的T。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

vector<int> A;


bool judge(int T,vector<int> &A,int &K,int &M)
{
    int size = A.size();
    int pt = 1;
    int now = M;
    for ( int i = 0; i < size; ++i) {

        if (A[i]- now>= 0) {
            now = M;
            ++pt;
            if(pt > K) return false;
        }
        else {
            now = min(M,now - A[i] + T);
        }
    }
    if (pt > K) return false;
    else 
        return true;

}


int Search(int low,int high,int &K,int &M)
{   

     while(low < high) {
        int mid = (low + high) / 2;
        if (judge(mid,A,K,M)) {
            high = mid;
        }
        else 
            low = mid + 1;
     }

     return low;

}


int main()
{
    int n,m,k,x;
    cin >> n >> m >> k;
    for (int i = 0; i < n; ++i) {
        cin>>x;
        A.push_back(x);
    }

    int res = Search(1,m,k,m);
    cout << res << endl;


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值