【贪心】Vijos P1615 旅行

题目链接:

  https://vijos.org/p/1615

题目大意:

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

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

题目思路:

  【贪心】

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

 1 //
 2 //by coolxxx
 3 //#include<bits/stdc++.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<string>
 7 #include<iomanip>
 8 #include<map>
 9 #include<memory.h>
10 #include<time.h>
11 #include<stdio.h>
12 #include<stdlib.h>
13 #include<string.h>
14 //#include<stdbool.h>
15 #include<math.h>
16 #define min(a,b) ((a)<(b)?(a):(b))
17 #define max(a,b) ((a)>(b)?(a):(b))
18 #define abs(a) ((a)>0?(a):(-(a)))
19 #define lowbit(a) (a&(-a))
20 #define sqr(a) ((a)*(a))
21 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
22 #define mem(a,b) memset(a,b,sizeof(a))
23 #define eps (1e-8)
24 #define J 10
25 #define mod 1000000007
26 #define MAX 0x7f7f7f7f
27 #define PI 3.14159265358979323
28 #define N 104
29 using namespace std;
30 typedef long long LL;
31 int cas,cass;
32 int n,m,lll,ans;
33 LL aans;
34 double anss;
35 LL a[N];
36 int main()
37 {
38     #ifndef ONLINE_JUDGE
39 //    freopen("1.txt","r",stdin);
40 //    freopen("2.txt","w",stdout);
41     #endif
42     int i,j,k;
43     int x,y;
44 //    for(scanf("%d",&cas);cas;cas--)
45 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
46 //    while(~scanf("%s",s+1))
47     while(~scanf("%d",&n))
48     {
49         for(i=1;i<=n;i++)
50             scanf("%lld",&a[i]);
51         for(i=2;i<n;i++)
52         {
53             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]);
54             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]);
55         }
56         for(i=2;i<=n;i++)
57             aans+=abs(a[i]-a[i-1]);
58         printf("%lld\n",aans);
59     }
60     return 0;
61 }
62 /*
63 //
64
65 //
66 */

时间: 2024-10-20 12:09:16

【贪心】Vijos P1615 旅行的相关文章

【vijos】1746 小D的旅行(dijkstra)

https://vijos.org/p/1746 这题就是水题.裸的跑完每个点的最短路后直接可以暴力出解.. 这题贴出来是因为我改了下我的dijkstra的模板... 注意vis不要提前加.否则你懂的.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #in

【vijos】1790 拓扑编号(拓扑+贪心)

https://vijos.org/p/1790 好神的贪心题.. 一开始我也想到了贪心,但是是错的..sad 就是因为每一个节点的编号与逆图的子树有关,且编号一定是>=子树的儿子+1的.但是想了想很快发现不可做..因为这种dfs牵扯到的东西太多了. 然后我想到这些约束是不是和差分约束有关,然后就脑补,可是后边发现这也是不可做的,因为差分约束算出来的不是编号.sad.. 无奈看题解. sad 这个和我第一个想法有关... 因为编号一定是>=逆图的子树儿子+1,显然如果每一次将编号从大向小的放是

【vijos】1791 骑士的旅行(特殊的技巧)

https://vijos.org/p/1791 暴力的话只想到bfs,然后估计是状态超了才得20分. 噗,为啥暴力就不能想得简单点QAQ.....这种思想很好啊. 这一题我看了题解后不得不说我竟然没想到.. 为啥要bfs..这种找路径的依赖前边状态的不需要bfs啊! 因为bfs是无限拓展的,状态很大,本题又是8种决策,状态达到8^n啊....sad.. 我们可以这样想,因为状态是向前走的,而且当前状态只依赖于前一个状态,那么我们可以用dp思想啊..直接枚举当前状态然后看是否根据上一状态到达,标

Vijos p1303导弹拦截(LIS+贪心)

传送门:https://vijos.org/p/1303 背景 实中编程者联盟为了培养技术精湛的后备人才,必须从基础题开始训练. 描述 某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试验阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 格式 输入格式 输入数据只有一行,该行包含若干个数据,之间用半角逗号隔开,表示导弹依次飞来的高

vijos 1605 双栈排序 - 贪心 - 二分图

题目传送门 传送门I 传送门II 题目大意 双栈排序,问最小字典序操作序列. 不能发现两个数$a_{j}, a_{k}\ \ (j < k)$不能放在同一个栈的充分必要条件时存在一个$i$使得$j < k < i$且$a_{i} < a_{j} < a_{k}$. 证明?写个dfs就证完了(就是考虑任意一个三元组). 然后可建图,对于满足上面条件的$(j, k)$,$j$和$k$连一条无向边. 显然必要条件时图不存在奇环,即能够二分染色. 再证明一下这是必要条件. 我们先构造

NYOJ 71 独木舟上的旅行【贪心】

解题思路:给出船的最大载重量w,和n个人,每只船最多可以乘坐两个人,问怎样坐船使得安排的船只的数量最少.这n个人的体重为a1,a2,a3,---,an-1,an首先将体重按升序排列好,再考虑最重的人,如果当前数列中连乘最轻的人都不能和他共乘一只船,那么他就只有一个人乘船了.                                                                 a[i](代表当前最轻的人)           a[j]代表当前最重的人  则j从n开始遍历,

NYOJ 71 独木舟上的旅行(贪心)

独木舟上的旅行 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量.我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅客的最少的独木舟条数.现在请写一个程序,读入独木舟的最大承载量.旅客数目和每位旅客的重量.根据给出的规则,计算要安置所有旅客必须的最少的独木舟条数,并输出结果. 输入 第一行输入s,表示测试数据的组数:每组数据的

Vijos 1776 关押罪犯 【并查集+贪心】

题目: S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c的冲突事件.每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S城Z市长那里.公务繁忙的Z市长只会去看列表中的第一

【vijos】1763 Wormhole(贪心)

https://vijos.org/p/1764 首先第一个虫洞一定是建在1号点. 证明如下: 假设一个虫洞在a,一个在b,a<b,那么走到k点的最短距离为 min{|x1-xk|, |x1-xa|+|xj-xk|},注意到|x1-xa|+|xj-xk|中的|x1-xa|是常数,而且对后一个|xj-xk|无影响,那么显然|x1-xa|取最小,即a=1 如果还没理解的我猜你没看到题目的一句话(就像我一开始一样):第二行,N个递增的整数,依次表示N个城市的坐标. 然后我们就可以枚举第二个虫洞的位置了