// 洛谷 p4995 跳跳
// 思路:
// 1. 先将石头进行 排序(从低到高 从高到低 都是可以)
// 2. 然后从 「地面」跳到「最高的石头」,再从「最高的石头」跳到「距离地面最近的石头」,再跳到「第二高的石头」,再跳到「距离地面最近的第2个石头」,以此类推,每跳一次计算其使用的体力多少
// 3. 计算公式为:(「第i块石头的高度」-「第j块石头的高度」)^2 / 「第i块石头的高度」^2
#include <iostream>
#include <algorithm>
using namespace std;
int main( void ){
int num; // 石头数量
cin >> num;
int data[ num + 1 ] = { 0 }; // 每个石头的高度 //记得初始化为0,因为data[0]必须为0,这个代表的是地面的高度
for( int i = 1; i < num + 1; i ++ ){
cin >> data[ i ];
}
sort( data + 1, data + num + 1); // 升序排序
int sum = 0; // 总体力值
// 两个坐标是从第一块石头到最后一块石头的前一块(最后一块石头已经算出来了)
int i = 0; // 地面 / 低的石头
int j = num; // 高的石头
while( i < j ){
// 循环条件: 定位坐标(浮标)分别在左右两侧,直到 左侧浮标与右侧浮标 重合
// 一个循环: 从下往上蹦 一次,从上往下蹦一次 ,一次循环,蹦哒两次
if( i == j ) break;
sum += (data[ j ] - data[ i ]) * (data[ j ] - data[ i ]); // i 跳到 j (从下往上跳)两个石头之间蹦哒 所花费的体力是多少
i ++; // 下面的浮标向上一个
if( i == j ) break;
sum += (data[ j ] - data[ i ]) * (data[ j ] - data[ i ]); // j 跳到 i (从上往下跳)
j --; // 上面的浮标向下一个
}
cout << sum;
return 0;
}
这个题测试点错了一半对了一半,然后这个题的测试点不能下载,也不知道是哪里错了