zoukankan      html  css  js  c++  java
  • bzoj:1575: [Usaco2009 Jan]气象牛Baric

    Description

    为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并按顺序记录了结果M_1...M_N(1 <= M_i <= 1,000,000). Betsy想找出一部分测量结果来总结整天的气压分布. 她想用K(1 <= K <= N)个数s_j (1 <= s_1 < s_2 < ... < s_K <= N)来概括所有测量结果. 她想限制如下的误差: 对于任何测量结果子集,每一个非此子集中的结果都会产生误差.总误差是所有测量结果的误差之和.更明确第说, 对于每一个和所有s_j都不同的i: * 如果 i 小于 s_1, 误差是: 2 * | M_i - M_(s_1) | * 如果i在s_j和s_(j+1)之间,误差是: | 2 * M_i - Sum(s_j, s_(j+1)) | 注:Sum(x, y) = M_x + M_y; (M_x 和 M_y 之和) * 如果i大于s_K,误差为: 2 * | M_i - M_(s_K) | Besty给了最大允许的误差E (1 <= E <= 1,000,000),找出最小的一部分结果史得误差最多为E.

    Input

    * 第一行: 两个空格分离的数: N 和 E

     * 第2..N+1行: 第i+1行包含一次测量记录:M_i

    Output

    * 第一行: 两个空格分开的数: 最少能达到误差小于等于E的测量数目和使用那个测量数目能达到的最小误差.

    Sample Input

    4 20
    10
    3
    20
    40

    输入解释:

    Bessie做了4次记录,分别为10,3,20,和40.最大允许误差是20.

    Sample Output

    2 17
     
     
    初二打noip普及组模拟赛的时候切过这题……
    dp[i][j]表示前i个数拿出了j个数,并且第i个数必定取到的最小误差。
    #include<queue>
    #include<cstdio>
    #include<algorithm>
    #define MN 102
    using namespace std;
    int read_p,read_ca,read_f;
    inline int read(){
        read_p=0;read_ca=getchar();read_f=1;
        while(read_ca<'0'||read_ca>'9') read_f=read_ca=='-'?-1:read_f,read_ca=getchar();
        while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
        return read_p*read_f;
    }
    
    int n,m,a[MN],mmh[MN][MN],C[MN][MN],q[MN],MMH=1e9,Mavis;
    inline int abs(int x){return x>0?x:-x;}
    inline void MIN(int &x,int y){if(x>y)x=y;}
    int main(){
        register int i,j,k;
        n=read();m=read();
        for (i=1;i<=n;i++) a[i]=read();
        
        for (i=1;i<=n;i++)
        for (j=i+1;j<=n;j++)
        for (k=i+1;k<j;k++) C[i][j]+=abs(a[k]+a[k]-a[i]-a[j]);
        
        for (i=1;i<=n;i++)
        for (j=1;j<i;j++) mmh[i][1]+=abs(a[i]-a[j])<<1;
        
        for (i=1;i<=n;i++)
        for (j=i+1;j<=n;j++) q[i]+=abs(a[i]-a[j])<<1;
        
        for (i=1;i<=n;i++)
        for (j=2;j<=i;j++)
        for (mmh[i][j]=1e9,k=j-1;k<i;k++) MIN(mmh[i][j],mmh[k][j-1]+C[k][i]);
        
        for (i=1;i<=n;i++)
        for (j=1;j<=i&&j<=MMH;j++)
        if (mmh[i][j]+q[i]<m)
        if (j<MMH) MMH=j,Mavis=mmh[i][j]+q[i];else if (j==MMH&&Mavis>mmh[i][j]+q[i]) Mavis=mmh[i][j]+q[i];
        
        printf("%d %d
    ",MMH,Mavis);
    }
    904 kb 16 ms C++/Edit 1296 B
  • 相关阅读:
    数据放在服务端和客户端的利与弊
    python异步I/O并发
    view
    mysql千万或者上亿的数据怎么设计数据库
    Django(一)
    JQuery
    BOM与DOM
    JavaScript
    CSS(二)
    CSS介绍
  • 原文地址:https://www.cnblogs.com/Enceladus/p/6098949.html
Copyright © 2011-2022 走看看