【每日一题】—— 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上的题目,想要学习算法的友友们千万别错过了,有什么疑问欢迎大家在评论区留言或者私信博主!
在这里送大家一句话:广积粮,缓称王!

相关推荐
灵感__idea3 小时前
Hello 算法:贪心的世界
前端·javascript·算法
小成202303202654 小时前
Linux高级02
linux·开发语言
钢琴上的汽车软件4 小时前
C 语言中const与指针:三种常见写法辨析
c语言·指针和const
知行合一。。。4 小时前
Python--04--数据容器(总结)
开发语言·python
咸鱼2.04 小时前
【java入门到放弃】需要背诵
java·开发语言
ZK_H4 小时前
嵌入式c语言——关键字其6
c语言·开发语言·计算机网络·面试·职场和发展
澈2075 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
A.A呐5 小时前
【C++第二十九章】IO流
开发语言·c++
椰猫子5 小时前
Java:异常(exception)
java·开发语言
lifewange5 小时前
pytest-类中测试方法、多文件批量执行
开发语言·python·pytest