题目 : 小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
关于题目中的修复时间
题目的意思是:修复是在某一时刻瞬间完成的。所以,如果0s时受到3点伤害,0.5秒时伤害减少为2点,1.5秒时伤害减少为1点。
不要把修复过程理解为:时刻i-0.5开始修复,时刻i+0.5时才伤害减少1点
放一个别人写的代码:
代码(别人的)
来自http://hihocoder.com/contest/...。
前面一大推的包含文件可以忽略。。。是acmer写代码之前的框架
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <complex>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include<iostream>
#include<cmath>
using namespace std;
#define N 100100
int a[N];
#define inf 0x3f3f3f3f
int n,m,k;
bool check(int mid)
{
int c=0,x=m;
for(int i=0;i<n;i++)
{
x=min(m,x+mid)-a[i];
if(x<=0){
c++;
x=m;
}
// if(mid==2)cout<<"x="<<x<<endl;
}
if(c>=k) return 1;
else return 0;
}
int main()
{
while(cin>>n>>m>>k)
{
for(int i=0;i<n;i++)
cin>>a[i];
int r=inf,l=1;
int mid=(l+r+1)/2;
while(l<r){
mid=(l+r)/2;
if(check(mid)==0)
r=mid;
else
l=mid+1;
// cout<<mid<<endl;
}
if(r==inf) cout<<-1<<endl;
else cout<<l<<endl;
}
return 0;
}
/*
a1b2a1
*/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。