• 洛谷P3650 [USACO1.3]滑雪课程设计Ski Course Design


    题意:

    给定一个数组,每次可以对数组中的任意一个数改动,改变(x)数值要(x²)的代价,要求数组中的最大数与最小数的差小于(17)
    (n≤1000),数组中每个数(≤100)

    思路:

    一看这数据就可以得出,(O(N^2))轻松水过。
    因为每个数都小于等于100,所以我们枚举最大值从(1)(100),每次求出当最大值为(i)的时候,将所有数改动成符合要求所花费的代价,从中间取最小值,输出即可。

    code:

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int N=10005;
    long long ans=0x7f7f7f7f,a[N],n;
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];
    	}
    	for(int i=17;i<=100;i++)//最大值最小是17,不是1,要不然都成负的了
    	{
    		long long sum=0;
    		for(int j=1;j<=n;j++)
    		{
    			if(a[j]<i-17)//如果比最小值小,则加上
    			{
    				sum+=(i-17-a[j])*(i-17-a[j]);
    			} 
    			else if(a[j]>i)//如果比最大值大,则削去
    			{
    				sum+=(a[j]-i)*(a[j]-i);
    			}
    		}
    		ans=min(ans,sum); //对所有求出的代价取min
    	}
    	cout<<ans;
        return 0;
    }
    
    
  • 相关阅读:
    《Spring2之站立会议1》
    《Spring1之第十次站立会议》
    《Spring1之第九次站立会议》
    《Spring1之第八次站立会议》
    《Spring1之第七次站立会议》
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
  • 原文地址:https://www.cnblogs.com/pjxpjx/p/12600445.html
Copyright © 2020-2023  润新知