C++题目乱解之洛谷P1047校门外的树

尼玛,这种简单的模拟题居然成了913天之前我还是小蒟蒻的时候的技术难关。这不就是个破模拟吗,谁都会,不要想得那么复杂。模拟真好,我爱模拟!!!

看到网上一堆玄学高级而离谱的解法,比如说线段树,珂朵莉树之类的,虽说高效,但是看到那一长串代码就感觉没啥胃口看下去。反正模拟可以解决的题,老子肯定用模拟(主要是因为懒得写那一些giao级算法,看着能把我难死)。

总之,这一道题我心里是五味杂陈啊!!

先看题目吧。

题目描述

某校大门外长度为 l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 l 的位置;数轴上的每个整数点,即 0,1,2,…,l,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有两个整数,分别表示马路的长度 l 和区域的数目 m。

接下来 m 行,每行两个整数 u,v,表示一个区域的起始点和终止点的坐标。

输出格式

输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

输入输出样例

输入 #1复制

500 3
150 300
100 200
470 471

输出 #1复制

298

说明/提示

【数据范围】

  • 对于 20%20% 的数据,保证区域之间没有重合的部分。
  • 对于 100%100% 的数据,保证1<=l<=10^4,1<=m<=100,0<=u<=v<=l。

【题目来源】

NOIP 2005 普及组第二题

这一题网上的做法是上下翻飞奇奇葩葩的,但是我还是喜欢回归本真,用我30个月之前学的模拟来做(主要是省事qwq……)

上代码!

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int l,a,b,m,ans=0;
int trees[N];
int main(){
    cin>>l>>m;
    while(m--){
        cin>>a>>b;
        for(int i=a;i<=b;i++) trees[i] = 1;
    }
    for(int i=0;i<=l;i++) if(!trees[i]) ans++;
    cout<<ans<<endl;
    return 0;
}

程序猿要有写简单低效代码的勇气。这个代码的思路再逊,只要学到初级知识多那么一miumiu就可以看懂吧。

定义一个长度1e4+10的int数组,代表数砍没被砍的状态,没被砍的话0,砍了的话1(主要是省事,不用再memset1一遍,正好全局数组自动全部搞成0)。之后的思路比才喝几罐就醉了的彬彬还要逊2.5倍,输入lm,然后m次操作,每一次都修改区间(我甚至都没有用差分,我哭死),tmd直接暴力我看谁能拿我怎么样!每一次要砍了,甭管他砍没砍,直接设置为已砍状态,砍完了的就当树根给拔喽(开玩笑的,目的就是把区间内没砍的都修改状态,那么改就完事了,如果已经砍掉了那再设置一遍也无妨),最后再从0到l统计有几个数还没被砍掉,ans++,最后输出ans。

就他妈这么简单!!!!

再见,今天心情很差。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值