zoukankan      html  css  js  c++  java
  • SPOJ:Elegant Permuted Sum(贪心)

    Special Thanks: Jane Alam Jan
    *At moment in University of Texas at San Antonio - USA

    You will be given n integers A1A2A3...An. Find a permutation of these n integers so that summation of the absolute differences between adjacent elements is maximized.

    Suppose n = 4 and the given integers are 4 2 1 5. The permutation 2 5 1 4 yields the maximum summation. For this permutation sum = abs(2-5) + abs(5-1) + abs(1-4) = 3+4+3 = 10.

    Of all the 24 permutations, you won’t get any summation whose value exceeds 10. We will call this value, 10, the elegant permuted sum.

    Input

    The first line of input is an integer T (T < 100) that represents the number of test cases. Each case consists of a line that starts with n (1 < n < 51) followed by n non-negative integers separated by a single space. None of the elements of the given permutation will exceed 1000.

    Output

    For each case, output the case number followed by the elegant permuted summation.

    Example

    Input:
    3
    4 4 2 1 5
    4 1 1 1 1
    2 10 1 Output: Case 1: 10
    Case 2: 0
    Case 3: 9
    题意:给定组数,现在要你排序,使得排序后所有相邻两个数的差的和最大。
    思路:排序,选择第一个点为左起点pos1,最后一个点为右起点pos2,然后以左起点和右起点贪心选择最大路径。
    应用模型:X轴上有N个点,现在要你选择一个点作为起点,然后一个个的访问未访问过的点,问访问完所有点的最小距离是多少。
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int T,N,i,Case=0,a[110],ans;;
        scanf("%d",&T);
        while(T--){
            scanf("%d",&N);
            for(i=1;i<=N;i++) scanf("%d",&a[i]);
            sort(a+1,a+N+1);
            ans=a[N]-a[1];
            int pos1=1,pos2=N,L=2,R=N-1;
            while(L<=R){
                int tmp=0,t[6];t[0]=-1; 
                t[1]=abs(a[pos1]-a[L]);
                t[2]=abs(a[pos2]-a[L]);
                t[3]=abs(a[pos1]-a[R]);
                t[4]=abs(a[pos2]-a[R]);
                for(i=1;i<=4;i++) if(t[i]>t[tmp]) tmp=i;
                ans+=t[tmp];
                if(tmp==1) pos1=L,L++;
                if(tmp==2) pos2=L,L++;
                if(tmp==3) pos1=R,R--;
                if(tmp==4) pos2=R,R--; 
            }
            printf("Case %d: %d
    ",++Case,ans);
        }
        return 0;
    }
  • 相关阅读:
    TFS 2013”无法移除仍为团队管理员身份的标识”
    如何在TFS的过程模板中添加报表
    集成TFS Build生成与SonarQube获取代码分析结果
    TFS 2015 Update 2功能探索
    使用Azure Automation(自动化)定时关闭和启动虚拟机
    TFS 与活动目录AD(Active Directory)的同步机制
    Eclipse 常用快捷键
    JMeter网站并发性测试
    docker安装配置GitLab
    javaWeb项目在用maven启动时必须要用到的坐标
  • 原文地址:https://www.cnblogs.com/hua-dong/p/8982117.html
Copyright © 2011-2022 走看看