【贪心】Vijos P1615 旅行

来源:互联网 发布:北京大学医学网络教育 编辑:程序博客网 时间:2024/06/04 19:58

题目链接:

  https://vijos.org/p/1615

题目大意:

  N条路,路的高度给你,走一条路的耗费体力是从上一条路的高度到当前路高度的绝对值差。

  可以改变一条路的高度,耗费的体力等于改变前后的路高度差。求最小耗费体力。

题目思路:

  【贪心】

  其实就是求拐点,一个人先下坡在上坡要耗费两次体力,不如直接把山谷改成和两边一样高的,这样答案更优。山顶同理。最后在计算一遍换完高度之后的高度差。




////by coolxxx//#include<bits/stdc++.h>#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<map>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define mem(a,b) memset(a,b,sizeof(a))#define eps (1e-8)#define J 10#define mod 1000000007#define MAX 0x7f7f7f7f#define PI 3.14159265358979323#define N 104using namespace std;typedef long long LL;int cas,cass;int n,m,lll,ans;LL aans;double anss;LL a[N];int main(){#ifndef ONLINE_JUDGE//freopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j,k;int x,y;//for(scanf("%d",&cas);cas;cas--)//for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s+1))while(~scanf("%d",&n)){for(i=1;i<=n;i++)scanf("%lld",&a[i]);for(i=2;i<n;i++){if(a[i-1]<a[i] && a[i]>a[i+1])aans+=abs(a[i]-max(a[i-1],a[i+1])),a[i]=max(a[i-1],a[i+1]);else if(a[i-1]>a[i] && a[i]<a[i+1])aans+=abs(a[i]-min(a[i-1],a[i+1])),a[i]=min(a[i-1],a[i+1]);}for(i=2;i<=n;i++)aans+=abs(a[i]-a[i-1]);printf("%lld\n",aans);}return 0;}/*////*/


0 0