50 条题解
-
0_orz_ LV 10 @ 2009-08-17 00:55:59
下午比赛的时候居然把题目看错了~
理解成只能把山变低了(教主变愚公了~Orz~太损RP了)~
没睡够~
然后刚刚交的时候~
第1次:累加的时候忘记写abs~0分
第2次:在把山变高的时候忘记写ans~依然0分~
第3次:AC~我的AC率~降了1个百分点~
-
02009-08-17 00:21:46@
一步一步走 每一步都将要走到的点与两边的比
(如 a,a[i],a, a[i]为要走到的点,(2 -
02009-08-17 00:20:57@
ORZ 1S
-
02009-08-16 23:50:13@
一开始比赛我就在群里发布了思路,好多人反对我……事实证明我的思路和解题报告一模一样。为什么要在吃饭的时候举办比赛?搞的我都没参加……
-
02009-08-16 23:47:01@
本来贪错了。。。。但是这个贪心方法怎么想到的??
-
02009-08-16 23:28:01@
枉杀我40分钟!
-
02009-08-16 09:47:14@
地板。。
-
02009-08-10 21:00:05@
Orz 教主 and tky神牛
-
-22016-08-13 13:23:43@
/*
贪心即可,对于中间的每一个山的高度,若:
1.该山比左右两山都更高,则与其从左山上山右下山(必然会浪费重复体力),
不如直接将中间山变矮,可以保证解更优*;先求出左右两山最高值,
将中间山变为此值高度即可,而变为更低山必然浪费体力。
2.该山比左右两山都更矮,则同理,将其变为左右两山的最小值即可。
处理完后,用魔法消耗的体力+一遍循环即可找出答案(abs)
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;long long a[100002];
long long n;
long long ans;int main()
{
cin>>n;
for(long long i=1;i<=n;i++)
cin>>a[i];
for(long long i=2;i<n;i++)
{
if(a[i]>a[i-1]&&a[i]>a[i+1])
{
long long x=max(a[i-1],a[i+1]);
ans+=(a[i]-x);
a[i]=x;
}
else if(a[i]<a[i+1]&&a[i]<a[i-1])
{
long long x=min(a[i+1],a[i-1]);
ans+=(x-a[i]);
a[i]=x;
}
}
for(long long i=1;i<n;i++)
ans+=abs(a[i+1]-a[i]);
cout<<ans<<endl;
return 0;
} -
-22015-12-20 15:53:50@
画个图就知道这题要求的是拐点,和摆花那题一样。
对于每个拐点,使用魔法改变其高度。拐点有两种:山峰和山谷。
+ 对于山峰i,hi = MAX{ h(i-1), h(i+1) }
+ 对于山谷i,hi = MIN{ h(i-1), h(i+1) }#include <stdio.h>
#include <stdlib.h>
int height[100005];
int MIN(int x, int y){
return x<y ? x:y;
}
int MAX(int x, int y){
return x>y ? x:y;
}
int main(){
int num, i, delta;
long long cost = 0;
scanf("%d", &num);
for(i=1; i<=num; i++)
scanf("%d", &height[i]);
height[0] = height[1];
height[num+1] = height[num];
for(i=1; i<=num; i++){
delta = 0;
if(height[i] > height[i-1] && height[i] > height[i+1])
delta = MAX(height[i-1], height[i+1]) - height[i];
else if(height[i] < height[i-1] && height[i] < height[i+1])
delta = MIN(height[i-1], height[i+1]) - height[i];
height[i] += delta;
cost += abs(delta);
}
for(i=2; i<=num; i++)
cost += abs(height[i]-height[i-1]);
printf("%I64d\n", cost);
return 0;
}