Codeforces 578C Weakness and Poorness

来源:互联网 发布:量表数据怎么录入excel 编辑:程序博客网 时间:2024/05/19 18:11

题目描述:给出一个数列,找出一个数x,使这个数列中每一个元素都减去x值所得的绝对值的和最小。
题目分析:当x非常大时,最终的答案值也会很大;当x为0时,一定可以找出一个大于0的值使每个元素减去它的答案值变小,因此这是一个三分题目。

#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 200010;const double eps = 1e-6;const int inf = 0x3f3f3f3f;const ll  INF = 0x3f3f3f3f3f3f3f3fLL;double arr[maxn];int n;double cal(double x) {    double t1 = 0, t2 = 0, maxsum = -INF, minsum = INF;     for(int i = 1; i <= n; ++i) {        if(t1 >= 0) {            t1 += arr[i] - x;        } else {            t1 = arr[i] - x;        }        if(t2 <= 0) {            t2 += arr[i] - x;        } else {            t2 = arr[i] - x;        }        maxsum = max(maxsum, t1);        minsum = min(minsum, t2);    }    return max(abs(maxsum), abs(minsum));}int main() {    scanf("%d", &n);    for(int i = 1; i <= n; ++i) {        scanf("%lf", &arr[i]);    }    double l = -10005.0, r = 10005.0;    int lim = 100;    while(lim--) {        double ll = l + (r - l) / 3.0;        double rr = r - (r - l) / 3.0;        if(cal(ll) > cal(rr)) {            l = ll;        } else {            r = rr;        }    }    printf("%.9lf\n", cal(l));    //cout<<cal(l);    return 0;}
原创粉丝点击