CF1726A Mainak and Array 题解

21 篇文章 0 订阅
博客主要解析了CF1726A题目的核心思路,讨论了如何通过三种特定操作[1,n],[2,n],[1,n-1]来最大化数组最后一个元素与第一个元素的差值。分析中指出,对于无效的操作,如l>=2&&r<=n-1,它们不会改变答案。并提供了针对不同操作范围的计算方法,包括找出最大值与最小值的差。最后,博客以轻松的语气提及了题目翻译者Zigh。" 137821147,22724863,Python实现简单人脸识别:10分钟快速入门,"['Python', '计算机视觉', '机器学习', '图像处理', 'OpenCV']
摘要由CSDN通过智能技术生成

2024/6/28UPD CSDN又擅自给我改VIP文章:(

题面

题目大意

给定一个长度为 n n n 的数组 a a a,可以选定一个区间 [ l ,    r ] [l, \; r] [l,r] 进行恰好一次操作,求操作后最大的 a n − a 1 a_n - a_1 ana1

操作方法:选定区间 [ l ,    r ] [l, \; r] [l,r] 和旋转次数 k k k, 每次旋转为 a l = a l + 1 ,    a l + 1 = a l + 2 ,    … ,    a r − 1 = a r ,    a r = a l a_l = a_{l + 1}, \; a_{l + 1} = a_{l + 2}, \; \dots, \; a_{r - 1} = a_r, \; a_r = a_l al=al+1,al+1=al+2,,ar1=ar,ar=al

输入格式

第一行一个整数 T    ( 1 ⩽ T ⩽ 50 ) T \; (1 \leqslant T \leqslant 50) T(1T50),表示测试样例组数。

对于每组测试样例,第一行为一个整数 n    ( 1 ⩽ n ⩽ 2000 ) n \; (1 \leqslant n \leqslant 2000) n(1n2000) 表示数组长度。

接下来的一行含有 n n n 个整数 a i    ( 1 ⩽ a i ⩽ 999 ) a_i \; (1 \leqslant a_i \leqslant 999) ai(1ai999),表示该数组。

数据保证 ∑ n ⩽ 2000 \sum n \leqslant 2000 n2000

输出格式

对于每组测试样例包含一行一个整数,表示最大的 a n − a 1 a_n - a_1 ana1

T r a n s l a t e d    b y    Z i g h Translated \; by \; Zigh TranslatedbyZigh

分析

根据题面,我们不难发现有效的操作只有 3 3 3 [ 1 ,    n ] , [ 2 ,    n ] , [ 1 ,    n − 1 ] [1, \; n], [2, \; n], [1, \; n - 1] [1,n],[2,n],[1,n1]。因为 l ⩾ 2    & &    r ⩽ n − 1 l \geqslant 2 \; \&\& \; r \leqslant n - 1 l2&&rn1 的操作一定是无效的,因为这样的操作显然不会影响答案。

对于 [ 2 ,    n ] [2, \; n] [2,n] 这样的操作不难发现答案是 max ⁡ i = 2 n { a i } − a 1 \max_{i = 2}^{n} \{a_i\} -a_1 maxi=2n{ai}a1 [ 1 , n − 1 ] [1, n - 1] [1,n1] 的同理为 a n − min ⁡ i = 1 n − 1 { a i } a_n - \min_{i = 1}^{n - 1} \{a_i\} anmini=1n1{ai}

对于 [ 1 ,    n ] [1, \; n] [1,n] 的操作,我们可以发现当原序列中的 a i a_i ai 作为结尾时,作为开头的一定是在原序列中的 a i + 1 a_{i + 1} ai+1。特别的,当 i = n i = n i=n 时开头应为 a 1 a_1 a1。我们只需要取出最大的 a i − a i + 1 a_i - a_{i + 1} aiai+1 即可。( 千万不要以为只用找这里面的最大数及它对应的开头 和 里面的最小数及它对应的结尾就行了,别问我怎么知道的,问就是不知道)。

代码

//省略快读和头文件
int T;
int n;
int a[MAXN];

int main()
{
	T = inpt();
	while(T--) {
		n = inpt();
		for(int i = 1; i <= n; i++)
			a[i] = inpt();
			
		int max_suf = -1e5, min_pre = 1e5;
		int tmp = -1e5;
		for(int i = 1; i <= n; i++) {
			if(i != 1) {
				max_suf = max(max_suf, a[i]);
			}
			if(i != n) {
				min_pre = min(min_pre, a[i]);
			}
			
			tmp = max(tmp, a[i] - a[i + 1 > n ? 1 : i + 1]);
		}
		
		int ans = max(a[n] - min_pre, max_suf - a[1]);
		ans = max(ans, tmp);
		
		printf("%d\n", ans);
	}

 	return 0;
}

最后来猜猜题目翻译里的 Z i g h Zigh Zigh 是谁呢Qwq。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值