Sabotage 二分

题目链接:http://www.usaco.org/index.php?page=viewproblem2&cpid=419

题意:有1,000,000个整数,要求从第2个到n-1个之间,删去一段连续的数,使得剩余数的平均数最小。( 1<=所有数<= 1e6).

题解:二分法,二分一个平均密度p,使原序列均减去p,求得2~n-1的最大连续和,可得到剩余数的和的正负值。若为正,则p小于mid;否则,p大于mid。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;

const int N = 1e5+10;
const double eps = 1e-4;
double a[N],b[N],high,low,sum;
int n;

double get(){
    double ans = 0,sum=0;
    double fumax = -1e8;
    int fl=1;
    for(int i=2;i<=n-1;i++){
        if(b[i]>0) fl=0;
        fumax = max(fumax,b[i]);
    }
    if(fl) return fumax;
    for(int i=2;i<=n-1;i++){
        if(sum+b[i]>0) sum += b[i];
        else sum = 0;
        ans = max(ans,sum);
    }
    return ans;
}

double solve(){
    while(high-low>eps){
        double mid = (low+high)/2;
        for(int i=1;i<=n;i++)
            b[i] = a[i]-mid;
        double maxd = get();
        double tmp = sum-n*mid-maxd;
        if(tmp < 0) high = mid;
        else low = mid;
    }
    return low;
}

int main(){
//    freopen("10.in","r",stdin);
    cin >> n;
    sum = 0;
    high = 1;low = 1e8;
    for(int i=1;i<=n;i++){
        scanf("%lf",&a[i]);
        sum += a[i];
        high = max(a[i],high);
        low = min(a[i],low);
    }
    double ans = solve();
    printf("%.3lf\n",ans);
    return 0;
}
时间: 2024-10-26 12:37:40

Sabotage 二分的相关文章

BZOJ 3477: [Usaco2014 Mar]Sabotage( 二分答案 )

先二分答案m, 然后对于原序列 A[i] = A[i] - m,  然后O(n)找最大连续子序列和, 那么此时序列由 L + mx + R组成. L + mx + R = sum - n * m, sum为原序列的和. 假如二分的答案m是可行的, 那么 L + R = sum - n * m - mx 应该 <= 0 ------------------------------------------------------------------------------------- #inc

LuoguP2115 [USACO14MAR]破坏Sabotage【二分答案】By cellur925

本来是想找一道生成树的题做的...结果被洛咕的标签骗到了这题...结果是二分答案与生成树一点mao关系都没有.... 题目大意:给你一个序列,请你删去某一个$l~r$区间的值($2<=i<=j<=n-1$),使得剩余元素的平均值最小. 开始是想二分序列长度的,后来发现没什么卵用...于是再想一想二分平均值,但是又感觉并没有二分单调性...(其实是满足的,因为我们二分出的最终答案,当比这个答案大的时候,我们一定能满足,小的时候一定不能满足.) 因为二分的复杂度带了一个$log$,所以我们$

[Usaco2014 Mar]Sabotage

[Usaco2014 Mar]Sabotage 题目 Farmer John"s arch-nemesis, Farmer Paul, has decided to sabotage Farmer John"s milking equipment! The milking equipment consists of a row of N (3 <= N <= 100,000) milking machines, where the ith machine produces

洛谷2115 [USACO14MAR]破坏Sabotage

https://www.luogu.org/problem/show?pid=2115 题目描述 Farmer John's arch-nemesis, Farmer Paul, has decided to sabotage Farmer John's milking equipment! The milking equipment consists of a row of N (3 <= N <= 100,000) milking machines, where the ith machi

JZOJ3966 Sabotage 题解

JZOJ3966 Sabotage 题解 Description FJ 的死对头,FP,现在决定了去破坏FJ 的挤奶设备! 这个挤奶设备由一行N(3 <= N<= 100, 000)个挤奶机器,其中第i 个机器生产Mi 单位的牛奶(1<= Mi <= 10, 000).FP 计划将机器连续的一块断开--从第i 个机器到第j 个机器(2<= i<= j<= N-1):注意第一个和最后一个机器FJ 并不想要断开,因为这会让这次事件太容易被发现.FP 的目标是让剩下的机

P2115 [USACO14MAR]破坏Sabotage

突然发现好像还没有写二分的题解,那今天就补充一下吧 ----------------------分割线---------------------- 题目描述 Farmer John's arch-nemesis, Farmer Paul, has decided to sabotage Farmer John's milking equipment! The milking equipment consists of a row of N (3 <= N <= 100,000) milking

2.1 二分分类

本周学习神经网络编程的基础知识 构建神经网络,有些技巧是非常重要 神经网络的计算过程中,通常有一个正向的过程(正向传播步骤),接着会有一个反向步骤(反向传播步骤), 为什么神经网络的计算可以分为前向传播和反向传播两个分开的过程?本周课程通过使用logistic回归来阐述,以便于能够更好的理解, logistic回归是一个用于二分分类的算法 比如有一个二分分类问题的例子, 假如有一张图像作为输入是这样的,你想输出识别此图的标签,如果是猫,输出1,如果不是,则输出0 使用y来表示输出的结果标签, 来

HDU3715(二分+2-SAT)

Go Deeper Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3184    Accepted Submission(s): 1035 Problem Description Here is a procedure's pseudocode: go(int dep, int n, int m)beginoutput the valu

二分查找

递归版(在区间[x, y)中找v的位置) 1 //递归版二分查找 2 int bsearch(int * A, int x, int y, int v) 3 { 4 5 if(v<a[x] || v>a[y-1]) return -1; 6 int m = x + (y-x)/2; //此处能不能用int m = (x+y)/2,需要仔细考虑(暂时想不到原因) 7 if(A[m]==v) return m; 8 else if(A[m]>v) return bsearch(A, x, m