zoukankan      html  css  js  c++  java
  • 厦门大学 ACM 1465 连续数列 三分

    http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1465

    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    double arr[112345];
    int N;
    inline double Abs( double x ){ return x>0?x:-x;}
    inline double Min( double a,double b ){return a>b?b:a;}
    
    double work( double ans )
    {
        double res = 0;
        for( int i = 1; i <= N; i++ )
            res += Abs( arr[i] - ans  );
        return res;
    }
    int main( )
    {
        while( scanf("%d",&N) != EOF )
        {
            for( int i = 1; i <= N; i++ )
                scanf("%lf",&arr[i]);
            sort( &arr[1],&arr[1]+N );
            for( int i = 1; i <= N; i++ )
            arr[i] -= (i-1);
            sort( &arr[1],&arr[1]+N );
            double lt = arr[1],rt = arr[N];
            while( rt - lt >= 3  )
            {
                double ans1 = (rt+lt+lt)/3.;
                double ans2 = (rt+rt+lt)/3.;
                double res1 = work(ans1);
                double res2 = work(ans2);
                if( res1 < res2 ) rt = ans2;
                else              lt = ans1;
            }
            lt = int (lt-1); rt = int( rt+1 );
            double res = work(lt*1.);
            for( int i = lt; i <= rt; i++ )
                res = Min( res,work(i*1.) );
            printf("%.lf\n",res);
        }
        return 0;
    }
    

     另一种方法

    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    long long arr[112345];
    int main( )
    {
        long long N;
        while( scanf("%lld",&N) != EOF )
        {
            for( long long i = 1; i <= N; i++ )
            scanf("%lld",&arr[i]);
            sort( &arr[1],&arr[1]+N );
            for( long long i = 1; i <= N; i++ )
            arr[i] -= (i-1);
            sort( &arr[1],&arr[1]+N );
            if( N%2 )
            {
                long long tab = N/2+1,res = 0;
                for( long long i = 1; i <= N; i++ )
                   res += abs( arr[i] - arr[tab] );
                printf("%lld\n",res);
            }
            else
            {
                long long tab1 = N/2;
                long long tab2 = N/2+1;
                long long res = 0,ans = 0;
                for( long long i = 1; i <= N; i++ )
                   ans += abs( arr[i] - arr[tab1] );
                for( long long i = 1; i <= N; i++ )
                   res += abs( arr[i] - arr[tab2] );
                printf("%lld\n",min( res,ans ) );
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    Activiti 整合的小插曲
    IDEA 提示找不到 javax 等 tomcat 的相关包
    一些好用的 Oracle 批处理和语句
    Oracle 日志报错导致的 “没有登录” 问题
    WebPack 从安装到闲置
    CHENEY-YANG'S BLOG(cheney-yang)
    Java基础知识常识总结
    激活Navicat
    IDEA文件头版权模板
    关于Spring框架中StringUtils常用/易误用方法解析
  • 原文地址:https://www.cnblogs.com/wulangzhou/p/3077745.html
Copyright © 2011-2022 走看看