列表

详情


NC24025. [USACO 2016 Jan G]Angry Cows

描述

Bessie the cow has designed what she thinks will be the next big hit video game: "Angry Cows". The premise, which she believes is completely original, is that the player shoots a cow with a slingshot into a one-dimensional scene consisting of a set of hay bales located at various points on a number line; the cow lands with sufficient force to detonate the hay bales in close proximity to her landing site, which in turn might set of a chain reaction that causes additional hay bales to explode. The goal is to use a single cow to start a chain reaction that detonates all the hay bales.
There are N hay bales located at distinct integer positions x1,x2,…,xN on the number line. If a cow is launched with power R landing at position x, this will causes a blast of "radius R", engulfing all hay bales within the range x−R…x+R. These hay bales then themselves explode (all simultaneously), each with a blast radius of R−1. Any not-yet-exploded bales caught in these blasts then all explode (all simultaneously) with blast radius R−2, and so on.

Please determine the minimum amount of power R with which a single cow may be launched so that, if it lands at an appropriate location, it will cause subsequent detonation of every single hay bale in the scene.

输入描述

The first line of input contains N (2≤N≤50,000). The remaining N lines all contain integers x1…xN (each in the range 0…1,000,000,000).

输出描述

Please output the minimum power R with which a cow must be launched in order to detonate all the hay bales. Answers should be rounded and printed to exactly 1 decimal point.

示例1

输入:

5
8
10
3
11
1

输出:

3.0

说明:

In this example, a cow launched with power 3 at, say, location 5, will cause immediate detonation of hay bales at positions 3 and 8. These then explode (simultaneously) each with blast radius 2, engulfing bales at positions 1 and 10, which next explode (simultaneously) with blast radius 1, engulfing the final bale at position 11, which finally explodes with blast radius 0.

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 17ms, 内存消耗: 892K, 提交时间: 2021-01-02 11:29:54

#include<cstdio>
#include<algorithm>
using namespace std;
int n,ans,a[100000],dp1[100000],dp2[100000];
int main()
{
    scanf("%d",&n);
    ans=2000000000;
    for(int i=1;i<=n;i++)
        scanf("%d",a+i);
    sort(a+1,a+n+1);
    int l=1;
    for(int i=2;i<=n;i++)
    {
        while(l<i&&dp1[l]+a[l]+1<a[i]) l++;
        if(l<i) dp1[i]=dp1[l]+1;
        else dp1[i]=a[i]-a[i-1];
    }
    int r=n;
    for(int i=n-1;i>=1;i--)
    {
        while(r>i&&-dp2[r]+a[r]-1>a[i]) r--;
        if(r>i) dp2[i]=dp2[r]+1;
        else dp2[i]=a[i+1]-a[i];
    }
    l=1,r=n;
    while(l<r)
    {
        ans=min(max(a[r]-a[l],2*max(dp2[r],dp1[l])+2),ans);
        if(dp1[l+1]<dp2[r-1]) l++;
        else r--;
    }
    printf("%.1f",(double)ans/2);
    return 0;
}

上一题