ACM-ICPC 2018 徐州赛区网络预赛 G Trace(贪心)

127 篇文章 0 订阅
18 篇文章 0 订阅

Trace

问题分析

题意: n n 波矩形海浪,每次都会在沙滩上留下痕迹,求最后的痕迹长度。
题解:因为题里保证了不会有海浪覆盖的情况,所以n波海浪都会凸出去,如果画个图看,就会发现我们只要逆序的处理每一个横坐标去找离它最近的并且比它小的横坐标累加这两个坐标的差值即可,纵坐标亦是如此。
如果当前坐标比列表已经处理的坐标小,那根据题目要求,对应的另一个坐标肯定要比他们都大,所以需要加上它的全部;如果能找到比当前坐标小的,那么我们就直接累加它俩的差值即可。

代码

#include <bits/stdc++.h>
typedef long long LL;
int n,x,y;
LL love(std::vector<int> fuck)
{
        std::set<int> s;
        LL ret = 0;
        for(int i = n-1; i >= 0; --i) {
                std::set<int>::iterator iter = s.lower_bound(fuck[i]);
                if(iter == s.begin()) //比当前列表里所有的都小
                        ret += fuck[i];
                else   //反之累加离它最近的比它小的坐标差值
                        ret += fuck[i] - *(--iter);
                s.insert(fuck[i]);
        }
        return ret;
}


int main(int argc, char const *argv[]) {
        scanf("%d", &n);
        std::vector<int> s,b;
        for(int i = 0; i < n; ++i) {
                scanf("%d%d",&x,&y);
                s.push_back(x);
                b.push_back(y);
        }
        printf("%lld\n", love(s)+love(b));
        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值