• 洛谷P4995 跳跳


    跳跳!

    题目描述

    你是一只小跳蛙,你特别擅长在各种地方跳来跳去。

    这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 i i i 块的石头高度为 h i h_i hi,地面的高度是 h 0 = 0 h_0 = 0 h0=0。你估计着,从第 i i i 块石头跳到第 j j j 块石头上耗费的体力值为 ( h i − h j ) 2 (h_i - h_j) ^ 2 (hihj)2,从地面跳到第 i i i 块石头耗费的体力值是 ( h i ) 2 (h_i) ^ 2 (hi)2

    为了给小 F 展现你超级跳的本领,你决定跳到每个石头上各一次,并最终停在任意一块石头上,并且小跳蛙想耗费尽可能多的体力值。

    当然,你只是一只小跳蛙,你只会跳,不知道怎么跳才能让本领更充分地展现。

    不过你有救啦!小 F 给你递来了一个写着 AK 的电脑,你可以使用计算机程序帮你解决这个问题,万能的计算机会告诉你怎么跳。

    那就请你——会写代码的小跳蛙——写下这个程序,为你 NOIp AK 踏出坚实的一步吧!

    输入格式

    输入一行一个正整数 n n n,表示石头个数。

    输入第二行 n n n 个正整数,表示第 i i i 块石头的高度 h i h_i hi

    输出格式

    输出一行一个正整数,表示你可以耗费的体力值的最大值。

    样例 #1

    样例输入 #1

    2
    2 1
    
    • 1
    • 2

    样例输出 #1

    5
    
    • 1

    样例 #2

    样例输入 #2

    3
    6 3 5
    
    • 1
    • 2

    样例输出 #2

    49
    
    • 1

    提示

    样例解释

    两个样例按照输入给定的顺序依次跳上去就可以得到最优方案之一。

    数据范围

    对于 1 ≤ i ≤ n 1 \leq i \leq n 1in,有 0 < h i ≤ 1 0 4 0 < h_i \leq 10 ^ 4 0<hi104,且保证 h i h_i hi 互不相同。

    对于 10 % 10\% 10% 的数据, n ≤ 3 n \leq 3 n3

    对于 20 % 20\% 20% 的数据, n ≤ 10 n \leq 10 n10

    对于 50 % 50\% 50% 的数据, n ≤ 20 n \leq 20 n20

    对于 80 % 80\% 80% 的数据, n ≤ 50 n \leq 50 n50

    对于 100 % 100\% 100% 的数据, n ≤ 300 n \leq 300 n300

    思路:我们只需要把石头从高到低排列下来,因为体力要消耗最大,所以每次尽可能的两个数差距最大,所以我们每次先跳到最高,然后再跳到最低,这样循环往复,就可以得到最后的结果!
    不过我因为体力当初设置的int类型,发现只有50分,后来发现可能是溢出了,把体力(sum)设置为long类型,就可以了!
    该算法是本人自己思考的结果,认为算法还是比较优的,如若有更好的想法,欢迎q我!
    代码如下(编译器是dev,语言是C语言):

    #include
    int n,a[305],i,j,temp,control=0,left,right;
    long sum = 0; 
    int main(){
        scanf("%d",&n);
        for(i =1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(i = 1;i<=n;i++){
            for(j = i+1;j<=n;j++){
                if(a[i]>a[j]){
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
        left = 0,right = n;
        for(i = 1;i<=n;i++){
            if(control == 0){
                control = 1;
                sum = sum + (a[right]-a[left])*(a[right]-a[left]);
                left++;
            }else if(control == 1){
                control = 0;
                sum = sum + (a[right]-a[left])*(a[right]-a[left]);
                right--;
            }
        }
        printf("%ld",sum);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    Javascript实现快速排序Quicksort
    Vue Router - 路由的使用、两种切换方式、两种传参方式、嵌套方式
    【汇编】#5 80x86指令系统其一(数据传送与算术)
    政安晨:【深度学习神经网络基础】(八)—— 神经网络评估回归与模拟退火训练
    ubuntu 配置nacos开机启动
    在Mac中管理多版本 java——安装和使用 jenv
    GitHub暴涨4W下载量!阿里内网的大型分布式技术手册到底有多强
    【面试普通人VS高手系列】线程池如何知道一个线程的任务已经执行完成
    【三维重建】逝去的摄影测量知识开始攻击我
    实验18.RIP路由引入
  • 原文地址:https://blog.csdn.net/weixin_43708800/article/details/128040951