zoukankan      html  css  js  c++  java
  • 1353. 滑雪场设计

    农夫约翰的农场上有 N 个山丘,每座山的高度都是整数。

    在冬天,约翰经常在这些山上举办滑雪训练营。

    不幸的是,从明年开始,国家将实行一个关于滑雪场的新税法。

    如果滑雪场的最高峰与最低峰的高度差大于17,国家就要收税。

    为了避免纳税,约翰决定对这些山峰的高度进行修整。

    已知,增加或减少一座山峰 xx 单位的高度,需要花费 x2 的金钱。

    约翰只愿意改变整数单位的高度。

    请问,约翰最少需要花费多少钱,才能够使得最高峰与最低峰的高度差不大于17。

    输入格式

    第一行包含整数 N。

    接下来 N 行,每行包含一个整数,表示一座山的高度。

    输出格式

    输出一个整数,表示最少花费的金钱。

    数据范围

    1N1000,
    数据保证,每座山的初始高度都在 0100 之间。

    输入样例:

    5
    20
    4
    1
    24
    21
    

    输出样例:

    18
    

    样例解释

    最佳方案为,将高度为 1的山峰,增加 3个单位高度,将高度为 24的山峰,减少 3 个单位高度。

    这题数据量比较小,因为可以直接穷举每一种方案;

    山峰的高度是在0-100之间,而题目要求最高峰和最低峰之间的差不能大于17,因此我们从最优子结构入手,穷举0-100之间的每一个长度为17的区间

    在穷举时,每一座低于区间左端点的山峰增加到左端点的高度,每一座高于区间右端点的山峰修改到右端点的高度,从而达到最优子结构的目的

    多个最优解合在一起必然得出的是最优解

    AC代码:

    #include<iostream>
    #include<algorithm>
    using namespace std ;
    const int N = 1000+10;
    int a[N];
    int n;
    
    inline int mypow(int n) {
        return n*n;
    }
    
    int main()
    {
        ios::sync_with_stdio(false);cin.tie(0);
        cin>>n;
        for(int i = 0;i<n;++i){
            cin>>a[i];        
        }
        
        int res = 20E7; //定义一个尽可能大的数 
        
        for(int minhight = 0;minhight<=83;++minhight){ //穷举84个区间 
            int money = 0;
            for(int i = 0;i<n;++i){  
                if(a[i]<minhight) money+=mypow(a[i]-minhight); //小于区间左侧的山峰进行整改 
                else if(a[i]>minhight+17) money+=mypow(a[i]-minhight-17); //大于区间右侧的山峰进行整改 
            }
            if(money<res) res = money; //选择最小花费 
        }
        cout<<res<<endl;
        return 0;
    }
  • 相关阅读:
    [DB] 数据库的连接
    JS leetcode 翻转字符串里的单词 题解分析
    JS leetcode 拥有最多糖果的孩子 题解分析,六一快乐。
    JS leetcode 搜索插入位置 题解分析
    JS leetcode 杨辉三角Ⅱ 题解分析
    JS leetcode 寻找数组的中心索引 题解分析
    JS leetcode 移除元素 题解分析
    JS leetcode 最大连续1的个数 题解分析
    JS leetcode 两数之和 II
    JS leetcode 反转字符串 题解分析
  • 原文地址:https://www.cnblogs.com/ssfannnnn/p/14337121.html
Copyright © 2011-2022 走看看