zoukankan      html  css  js  c++  java
  • [USACO][枚举]Ski Course Design

    题意:

    给出N个山峰高度,高度属于[0,100]units;Farmer FJ需要做一些修改,来保证最高高度和最低高度的差值不大于17uints。这个修改包括减小最高山峰和增高最低山峰高度,并且修改x unit的高度要付出x^2的费用。

    给出N个山峰的高度,求出满足要求修改的最小费用。

    思路:

    枚举所有可能的高度上下限(约定maxh-minh==17),判断此时的耗资是否最小。

    排序实际上是没有必要的。只要每次都完全遍历hil[]数组,判断比下限小的靠近下限,比上限大的靠近上限就可以了。

    自己写的时候下意识地排了序开了long long--毕竟在思路上还没发现坑之所在。

    代码:

     1 #include<cstdio>
     2 #include<cstdlib>
     3 typedef long long LL;
     4 const int l=17;
     5 int N;
     6 LL a[1003];
     7 int cmp(const void *a,const void *b){
     8     return *(LL *)a-*(LL *)b;
     9 }
    10 LL cal(int beg,int end,int x,int y){
    11     LL ans=0;
    12     for(int i=0;i<beg;i++)ans+=(a[i]-x)*(a[i]-x);
    13     for(int i=end+1;i<N;i++)ans+=(a[i]-y)*(a[i]-y);
    14     return ans;
    15 }
    16 int find(int x,int pos){
    17     int i;
    18     if(!pos){
    19         i=0;
    20         while(a[i]<x)i++;
    21     }else {
    22         i=N-1;
    23         while(a[i]>x)i--;
    24     }
    25     return i;
    26 }
    27 int main(){
    28     freopen("skidesign.in","r",stdin);
    29     freopen("skidesign.out","w",stdout);
    30     scanf("%d",&N);
    31     for(int i=0;i<N;i++)scanf("%lld",&a[i]);
    32     qsort(a,N,sizeof(a[0]),cmp);
    33     LL ans=1<<30;
    34     for(int i=a[0];i+l<=a[N-1];i++){
    35         int p=find(i,0);
    36         int q=find(i+l,1);
    37         if(cal(p,q,i,i+l)<ans)ans=cal(p,q,i,i+l);
    38     }
    39     printf("%lld
    ",ans);
    40     return 0;
    41 }
    View Code
  • 相关阅读:
    MySQL 函数
    ARC072_F Dam
    1373D
    科目二和科目三找准30厘米位置的点位
    MySQL 数字保留两位小数
    IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
    MySQL SQL语句书写顺序和执行顺序
    科目三道路驾驶技能考试之百米加减挡操作
    上海科目三道路驾驶技能考试夜间灯光模拟操作
    上海 科目三大路考试攻略
  • 原文地址:https://www.cnblogs.com/ggy778/p/12231289.html
Copyright © 2011-2022 走看看