洛谷传送门:Mainak and Array - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
难度:暂无评定
知识点:思维题(分类讨论)
思路:
分类讨论选旋转区间
1、[1,n]
可以找到紧挨着的两个数的落差是最大的(不一定是最大的或者是最小的)
2、[1,n-1]或者[2,n]
可以得到两个答案
原n号位的数-minn
maxn-原1号位的数
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int q,n,ans; scanf("%d", &q);
int arr[2005];//数组长1到2000(其实可以不开数组,可以优化内存)
while(q--){
int ans3 = 0, chapre;//1、[1,n]
int maxn = 0,minn = 1000, ans1, ans2;//2、[1,中间]或者[中间,n]
scanf("%d", &n);
for(int i = 0; i<n; i++){
scanf("%d", &arr[i]);
if(arr[i]>maxn) maxn = arr[i];
if(arr[i]<minn) minn = arr[i];
}
//1、[1,n]
arr[n] = arr[0];
for(int i = 0; i<n; i++){
chapre = arr[i] - arr[i+1];
if(chapre>ans3) ans3 = chapre;
}
//2、[1,中间]或者[中间,n]
ans1 = arr[n-1] - minn;
ans2 = maxn - arr[0];
//综上所述
ans = ans1;
if(ans2>ans) ans = ans2;
if(ans3>ans) ans = ans3;
printf("%d\n", ans);
}
return 0;
}
/*
知识点:思维题(分类讨论)
思路:
分类讨论选旋转区间
1、[1,n]
可以找到紧挨着的两个数的落差是最大的(不一定是最大的或者是最小的)
2、[1,n-1]或者[2,n]
可以得到两个答案
原n号位的数-minn
maxn-原1号位的数
心路历程:
观察:因为每个样例输出的都是最大减去最小的
猜测1:答案就是最大减去最小的
验证:
999 x 1 y z
只能保证可以让最大的去n号位,最小的去1号位,不能保证同时达成
选取区间:作用是改1和n号位置的数
要么[1,n][1,中间][中间,n][中间,中间]只有这四种操作
[中间,中间]不换(1是最小,或者n是最大)
[1,中间]把1换成最小的数
[中间,n]把n换成最大的数
[1,n]同时换,可能刚好有最大的,只可能是 x y 999 1 z 这种紧接着的情况
同时换也有可能可以搞出比只换一头的要大
所以这题,可能是一个分类讨论的题,对四种操作分类讨论
【转去看思路】
*/