西南民族大学第十届校赛(同步赛)F
题目描述
总所不周知!ZZZZone有了女朋友却谁也不知道。但是ZZZZone在集训队总是和陈大佬走的很近,每天搂搂抱抱十分不成体统!于是就被ZZZZone的女朋友给知道了,但是呢,ZZZZone的女朋友是一个热爱画画的温柔又可爱的女子,于是她决定把ZZZZone大卸两块,没错是两块!!
ZZZZone呢他的长度为 n,并且每个单位长度都有一个相对应的重量,他的小女朋友希望将ZZZZone切成两部分后,两个部分中的最大重量之差的绝对值最大(显然两个部分均不能为空啊),她呢觉得很惆怅,不知道该怎么切最好,所以想让你们来想想办法。
输入描述:
第一行为一个n(2 <= n <= 105),表示ZZZZone的长度,第二行为n个数,表示ZZZZone每个单位长度的重量(0 <= a[i] <= 106)。
输出描述:
输出切成两部分后,每部分的重量的最大值之差的绝对值最大是多少。
示例1
输入
4 3 4 1 6
输出
3
备注:
对于样例: 4 3 4 1 6 那么一共有 3 种切法,分别是: 第一部分为 { 3 }, 第二部分为{ 4,1,6 },此时两部分的最大值之差的绝对值为 3 第一部分为 { 3,4 }, 第二部分为{ 1, 6 },此时两部分的最大值之差的绝对值为 2 第一部分为 { 3,4,1 }, 第二部分为{ 6 },此时两部分的最大值之差的绝对值为 2 所以答案为3.
思路:
emmm。。。。不知道为啥有人说暴力可以过,我们的暴力不一样???
这个数组被拆分成俩部分 , 那包含最大的为一部份。第一个数或最后一个数如果很小 , 那么刚好在第一个或最后一个那儿分
。
如果第一个数或最后一个数不小 , 那么不论怎么分 , 都至少要大于等于第一个数的大小。
所以,先找到最大的数 , 然后再去判断第一个数和最后一个数的大小 , 减去zui最小的那个就行啦
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxn = 1e5+8;
int a[maxn];
int main()
{
int n , op = -99999;
scanf("%d" , &n);
for(int i = 0 ; i < n ; i++)
{
scanf("%d" , &a[i]);
if(op < a[i])
{
op = a[i];
}
}
printf("%d\n" , op - min(a[0] , a[n-1]));
return 0;
}