/ Vijos / 题库 / 旅行 /

题解

50 条题解

  • 0
    @ 2009-08-17 00:55:59

    下午比赛的时候居然把题目看错了~

    理解成只能把山变低了(教主变愚公了~Orz~太损RP了)~

    没睡够~

    然后刚刚交的时候~

    第1次:累加的时候忘记写abs~0分

    第2次:在把山变高的时候忘记写ans~依然0分~

    第3次:AC~

    我的AC率~降了1个百分点~

  • 0
    @ 2009-08-17 00:21:46

    一步一步走 每一步都将要走到的点与两边的比

    (如 a,a[i],a, a[i]为要走到的点,(2

  • 0
    @ 2009-08-17 00:20:57

    ORZ 1S

  • 0
    @ 2009-08-16 23:50:13

    一开始比赛我就在群里发布了思路,好多人反对我……事实证明我的思路和解题报告一模一样。为什么要在吃饭的时候举办比赛?搞的我都没参加……

  • 0
    @ 2009-08-16 23:47:01

    本来贪错了。。。。但是这个贪心方法怎么想到的??

  • 0
    @ 2009-08-16 23:28:01

    枉杀我40分钟!

  • 0
    @ 2009-08-16 09:47:14

    地板。。

  • 0
    @ 2009-08-10 21:00:05

    Orz 教主 and tky神牛

  • -2
    @ 2016-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;
    }

  • -2
    @ 2015-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;
    }

信息

ID
1615
难度
5
分类
贪心 点击显示
标签
递交数
1979
已通过
755
通过率
38%
被复制
2
上传者