🌏博客主页:PH_modest的博客主页
🚩当前专栏:每日一题
💌其他专栏:
🔴 每日反刍
🟡 C++跬步积累
🟢 C语言跬步积累
🌈座右铭:广积粮,缓称王!
一.题目描述
题目大意:
题目链接:
C. Challenging Cliffs(Codeforces Round 726 (Div. 2))
二.思路分析
- 首先将给的数排序
- 然后找相邻两数绝对值最小的两个数(将他们的下标记为l和r),这两个数肯定是放在头和尾,因为题目要求是第一个和最后一个山峰绝对值最小
- 之后就剩下l前面的数和r后面的数了,这两组数都是已经排好序的(将前面一组记为P,后一组记为Q),也就是说他们都是困难程度最大的情况
- 接下来就面临两种选择,先放P后放Q,先放Q后放P,大部分人都觉得先放P后放Q更好,真的是这样的吗?
第二张图应该可以较为清楚的解释为什么这样较好,这里就不过多赘述了。
三.代码展示
cpp
#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
int s[200020];
void solve()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i];
}
sort(s,s+n);
int l=0,r=l+1;
int mins=1e9;
for(int i=0;i<n-1;i++)
{
if(s[i+1]-s[i]<mins)
{
mins=s[i+1]-s[i];
l=i;
r=i+1;
}
}
cout<<s[l]<<" ";
for(int i=r+1;i<n;i++)
{
cout<<s[i]<<" ";
}
for(int i=0;i<l;i++)
{
cout<<s[i]<<" ";
}
cout<<s[r]<<"\n";
}
signed main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
最后:
每日一题系列旨在养成刷题的习惯,所以对代码的解释并不会特别详细,但足够引导大家写出来,选的题目都不会特别难,但也不是特别简单,比较考验大家的基础和应用能力,我希望能够将这个系列一直写下去,也希望大家能够和我一起坚持每天写代码。
之后每个星期都会不定期更新codeforces和atcoder上的题目,想要学习算法的友友们千万别错过了,有什么疑问欢迎大家在评论区留言或者私信博主!
在这里送大家一句话:广积粮,缓称王!