Tourist‘s_Notes(模拟)

传送门

  • 题意:旅行者每天都会记录自己的海拔高度,他每天规定走海拔相差不超过1的路线,有一天他的记录丢失了,只剩下几天的,问你他之前有可能到达的最高海拔是多少,如果数据出现矛盾,输出"IMPOSSIBLE"
  • 思路:用两个数组记录天数和当天的海拔高度,如果相隔的海拔差比相隔的天数差还大的话就是矛盾,否则就这样计算相隔天数中可能的最大海拔高度: M a x H i g h t = ( d a y [ i ] + h i g h t [ i ] − ( d a y [ i − 1 ] − h i g h t [ i − 1 ] ) ) / 2 MaxHight = ( day[i] + hight[i] - (day[i - 1] - hight[i - 1]) ) / 2 MaxHight=(day[i]+hight[i](day[i1]hight[i1]))/2,最后取众多MaxHight的最大值
  • 注意:第一天和最后一天的数据可能没给,所以我们要自己造一个可能的最大高度,例如只给你第3天的海拔高度为5,总共旅行的天数为4,那么我们就自己造一个第一天的高度为7 ( 5 + 3 − 1 ) (5 + 3 - 1) (5+31),第4天的高度为6 ( 5 + ( 4 − 3 ) ) (5 + (4 - 3)) (5+(43)),就是一开始没想到这个,wa了2发/(ㄒoㄒ)/~~
  • 代码如下:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>

using namespace std;

const int M = 1e5 + 10;
int n, m, d[M], h[M];
bool ok = true;

int main() {
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
        scanf("%d%d", d + i, h + i);
        if (i != 1 && d[i] - d[i - 1] < abs(h[i] - h[i - 1])) {
            ok = false;
        }
    }
    if (ok) {
        h[0] = h[1] + d[1] - 1, h[m + 1] = h[m] + (n - d[m]);
        d[0] = 1, d[m + 1] = n;
        int Max = h[0];
        for (int i = 1; i <= m + 1; i++) {
            int tmp = (d[i] + h[i] - (d[i - 1] - h[i - 1])) >> 1;
            Max = max(Max, tmp);
        }
        printf("%d\n", Max);
    } else {
        printf("IMPOSSIBLE\n");
    }
    return 0;
}

原地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值