小Ho的防护盾@hihoCoder

时间限制: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 越小,小ho撑过 n 次攻击的可能性越小,如果 t 是确定的,那么整个攻击过程就确定了,小hi能不能破坏城市也就确定了,所以我们可以用一个 bool 类型的数组 test[i] 来表示 t = i 时,小hi是否可以破坏城市(true代表可以,否则反之)。那么在 test 数组中,false值一定会出现在true值(可以将test数组变相地看作是有序的),所以问题就传化为求最早出现的false值的下标(即 t)。有序数组 + 求最小的符合条件的值的下标 → 考虑lower_bound 的用法。

但是我们在代码中,不必先建立好数组,可以使用到哪一个值时再计算这个值是否符合条件,就类似于二分查找跟哈希查找的区别一样,可以节省部分时间。

#include <iostream>
#include <algorithm>
#define MAXN 100005
using namespace std;

int n,m,k;
int A[MAXN];

bool test(int t){       //test数组的意义为判断时间间隔为 t 时,小hi是否可以破环城市。
    int cnt = 0;
    int tmp = m;
    for(int i=0;i<n;++i){
        if(A[i] >= tmp){
            ++cnt;
            tmp = m;
        }
        else{
            tmp -= A[i];
            tmp += t;
            if(tmp > m) tmp = m;
        }
        if(cnt >= k) return true;
    }
    return false;
}

int main(){
    cin >> n >> m >> k;
    int cnt = 0;
    for(int i=0;i<n;++i){
        cin >> A[i];
        if(A[i] >= m) ++cnt;
    }
    if(cnt >= k){             //特判:无论时间间隔多大,小hi一定可以破坏城市的情况。
        cout << -1 << endl;
        return 0;
    }
    int l = 1,r = m;      //如果上面的特判不成立,那么test(m)一定是false,所以我们可以初始化r和ans为m,
    int ans = m;
    while(l <= r){
        int mid = l + (r-l)/2;
        if(test(mid)){
            l = mid + 1;
        }
        else{
            ans = mid;
            r = mid - 1;
        }
    }
    cout << ans << endl;
    return 0;
}

 题目链接

猜你喜欢

转载自blog.csdn.net/qq_39021458/article/details/81117766
今日推荐