2 C. Challenging Cliffs
原题链接:Problem - 1537C - Codeforces
rating : 1200
题目描述:
你是一名游戏设计师,想要创建一个障碍赛道。玩家将从左到右行走。你已经选择了 n 座山的高度,并希望安排它们,以便第一座和最后一座山的高度差的绝对值尽量小。
此外,你想要使游戏更具挑战性,由于上坡或平地比下坡更难走,级别的难度将是山的数量 i(1≤i<n),使得 hi≤hi+1,其中 hi 是第 i 座山的高度。你不想浪费你建模的任何山,因此你必须使用它们所有。
从所有使 |h1−hn| 最小化的安排中找到一个最困难的。如果有多个满足这些要求的排序,可以选择任何一个。
思路描述:
这道题的意思是,只要后面一座山的高度大于等于前面这座山,那我们就认为游戏总难度+1,总难度只跟山的数量有关,与山之间具体差多少高度无关
所以我们就要将尽可能多的高山排在后面
首先,找到高度差绝对值最小的两座山放在起点和重点,小山在前,高山在后
将剩下数据由小到大排序
比终点矮的山,都要放在终点前,这样保证了终点这座山没有被浪费,其余的放在起点后由小到大输出即可
完整代码:
#include<iostream>
#include<algorithm>int t;
int n;
int arr[1000100];
int main(){std::cin>>t;while(t--){std::cin>>n;for(int i=1;i<=n;i++)std::cin>>arr[i];std:: sort(arr+1,arr+n+1);int cha = arr[n] - arr[1];int loc = 1;//找到最的差值for(int i = 1;i<n;i++){if(arr[i+1]-arr[i]<cha){cha = arr[i+1]-arr[i];loc = i;}} std::swap(arr[1],arr[loc]);std::swap(arr[n],arr[loc+1]);std:: sort(arr+2,arr+n);std::cout<<arr[1]<<' ';for(int i=2;i<n;i++){if(arr[i]>arr[1])std::cout<<arr[i]<<' ';}for(int i=2;i<n;i++){if(arr[i]<=arr[1])std::cout<<arr[i]<<' ';}std::cout<<arr[n]<<std::endl;;}
}