2019百度之星第一场初赛2,5题

本文详细解析了如何通过寻找每次移动的最左和最右位置,来解决区间遍历问题。通过实例说明了如何更新区间并计算最小步数,同时提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1002:
题意:
给n个区间,需要依次走完这些区间,注意是依次,一开始没看见我也忽略了
题解:
找到每次移动的最左位置和最右位置,判断要到达的区间和目前左右位置的关系。
样例举例:
最开始最左是0,最右是1000000,ans=0,因为可以在这个区间随意放置
添加第一个区间【1,10】,发现这个区间和目前区间有交,ans不需要更新操作,此时只需要更新区间为【1,10】
添加第二个区间【20,30】,和目前区间无交集,更新ans,并更新区间为【20,20】
为什么要更新成【20,20】?因为你执行完最小步数且在目标区间类的最终坐标只能是20.当然如果最终区间是【19,30】,你更新的新区间就是【19,20】
代码奉上吧。。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1001;
struct road{
    int l,r;
    bool operator<(const road& a)const {
        if(l!=a.l)return l<a.l;
        return r<a.r;
    }
}r[maxn];
int ans;
int n;
void dfs(int i,int lp,int rp){
    if(i==n+1)return;
    if(r[i].l<=lp&&r[i].r>=lp||r[i].l<=rp&&r[i].r>=rp||r[i].l>=lp&&r[i].l<=rp||r[i].r>=lp&&r[i].r<=rp){
        //上面这个if有点长就是两个区间有交集的意思
        //更新区间,不更新ans
        lp=max(lp,r[i].l);
        rp=min(rp,r[i].r);
        dfs(i+1,lp,rp);
    }
    else{
        //无交集,更新ans,更新区间
        int lasp=r[i].l>rp?r[i].l:r[i].r;
        int len=min(abs(r[i].l-rp),abs(r[i].r-lp));
        ans+=len-len/2;
        if(!(len&1))dfs(i+1,lasp,lasp);
        else{
            if(r[i].l!=r[i].r){
                if(r[i].l>rp)dfs(i+1,lasp,lasp+1);
                else dfs(i+1,lasp-1,lasp);
            }
            else dfs(i+1,lasp,lasp);
        }
    }
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int a,b;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&r[i].l,&r[i].r);
        }
        ans=0;
        int lp=0,rp=1000000;
        dfs(1,lp,rp);
        printf("%d\n",ans);
    }
    return 0;
}

5题就一个找规律题打个表就行了
规律是每六个数一个式子


		scanf("%lld",&n);
        ll x=ceil(1.0*n/6);
        n%=6;
        if(n==0){
            printf("%lld\n",3*x);
        }
        else if(n==1){
            printf("%lld\n",4*x-3);
        }
        else if(n==2){
            printf("%lld\n",3*x-2);
        }
        else if(n==3){
            printf("%lld\n",x-1);
        }
        else if(n==4){
            printf("%lld\n",6*x-3);
        }
        else if(n==5){
            printf("%lld\n",x-1);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Macarons_i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值