【每日一题】—— C. Challenging Cliffs(Codeforces Round 726 (Div. 2))

🌏博客主页:PH_modest的博客主页

🚩当前专栏:每日一题

💌其他专栏:

🔴 每日反刍

🟡 C++跬步积累

🟢 C语言跬步积累

🌈座右铭:广积粮,缓称王!

一.题目描述

题目大意:

题目链接:

C. Challenging Cliffs(Codeforces Round 726 (Div. 2))

二.思路分析

  1. 首先将给的数排序
  2. 然后找相邻两数绝对值最小的两个数(将他们的下标记为l和r),这两个数肯定是放在头和尾,因为题目要求是第一个和最后一个山峰绝对值最小
  3. 之后就剩下l前面的数和r后面的数了,这两组数都是已经排好序的(将前面一组记为P,后一组记为Q),也就是说他们都是困难程度最大的情况
  4. 接下来就面临两种选择,先放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上的题目,想要学习算法的友友们千万别错过了,有什么疑问欢迎大家在评论区留言或者私信博主!
在这里送大家一句话:广积粮,缓称王!

相关推荐
Tony Bai1 小时前
高并发后端:坚守 Go,还是拥抱 Rust?
开发语言·后端·golang·rust
wjs20241 小时前
Swift 类型转换
开发语言
前端小L1 小时前
贪心算法专题(十):维度权衡的艺术——「根据身高重建队列」
javascript·算法·贪心算法
方得一笔1 小时前
自定义常用的字符串函数(strlen,strcpy,strcmp,strcat)
算法
秃了也弱了。2 小时前
python实现定时任务:schedule库、APScheduler库
开发语言·python
YJlio2 小时前
VolumeID 学习笔记(13.10):卷序列号修改与资产标识管理实战
windows·笔记·学习
weixin_440730502 小时前
java数组整理笔记
java·开发语言·笔记
小龙2 小时前
【学习笔记】多标签交叉熵损失的原理
笔记·学习·多标签交叉熵损失
Dillon Dong2 小时前
从C到Simulink: 使用STM32硬件支持包后为什么还不支持PC仿真ARM建模程序
c语言·stm32·simulink
Xの哲學2 小时前
Linux SMP 实现机制深度剖析
linux·服务器·网络·算法·边缘计算