zoukankan      html  css  js  c++  java
  • USACO Ski Course Design

    洛谷P3650

    https://www.luogu.org/problemnew/show/P3650

    JDOJ 2393

    https://neooj.com:8082/oldoj/problem.php?id=2393

    题目描述

    农民约翰的农场里有N座山峰(1<=N<=1000),每座山都有一个在0到100之间的整数的海拔高度。在冬天,因为山上有丰富的积雪,约翰经常开办滑雪训练营。

    不幸的是,约翰刚刚得知税法在滑雪训练营方面有新变化,明年开始实施。在仔细阅读法律后,他发现如果滑雪训练营的最高和最低的山峰海拔高度差大于17就要收税。因此,如果他改变山峰的高度(使最高与最低的山峰海拔高度差不超过17),约翰可以避免支付税收。

    如果改变一座山x单位的高度成本是x^2单位,约翰最少需要付多少钱?约翰只愿意改变整数单位的高度。

    输入输出格式

    输入格式:

    第一行:一个整数n

    第二行到N+1行:每行是一座山的海拔高度

    输出格式:

    约翰需要支付修改山海拔高度的总金额,最高和最低的山峰间高度差最多17。

    输入输出样例

    输入样例#1: 复制
    5
    20
    4
    1
    24
    21
    输出样例#1: 复制
    18

    一开始想到的思路是直接做最大值最小值差之后平方,看完样例之后发现显然是不对的。
    那么正解是什么呢?由此开始了痛苦的思考,发现此题的思路和动态规划类似(注意绝不是动态规划,没有无后效性质)。我们需要针对每一座山峰维护花钱的最小值。
    思路也比较好理解,分两层枚举,第一层枚举所有山可能的高度(肯定会在最大值和最小值之间),第二层枚举实际每座山的高度,判断它们的差与17的关系,高于则全部砍掉,低于就砍掉差小于17的部分。
    注意,层数不要弄反,第一层枚举的是高度,每一次枚举都要计算出当前高度的最小值,最后再取小即可。
    ACcode:
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n;
    int a[1010];
    int sum;
    int ans=2147483647;
    bool cmp(int a,int b)
    {
        return a<b;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+n+1,cmp);
        for(int i=a[1];i<=a[n];i++)
        {
            sum=0;
            for(int j=1;j<=n;j++)
            {
                if(a[j]-i>17)
                    sum+=(a[j]-i-17)*(a[j]-i-17);
                if(a[j]<i)
                    sum+=(i-a[j])*(i-a[j]);
            }
            ans=min(sum,ans);
        }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    能混绝不C————事后诸葛亮
    能混绝不c————测试总结
    能混绝不C————冲刺总结
    能混绝不c———— 冲刺集合
    大爷的超市管理系统——冲刺第七天
    大爷的超市管理系统——冲刺第六天
    大爷的超市管理系统——冲刺第五天
    大爷的超市管理系统——冲刺第四天
    大爷的超市管理系统——冲刺第三天
    大爷的超市管理系统——冲刺第二天
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11183485.html
Copyright © 2011-2022 走看看