首页 > 其他分享 >P3957[NOIP2017普及组]跳房子

P3957[NOIP2017普及组]跳房子

时间:2024-07-23 21:29:58浏览次数:14  
标签:NOIP2017 跳房子 cur int ll read P3957 getchar

https://www.luogu.com.cn/problem/P3957

https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=337image-20240723211800507

显然,但是维护滑动窗口有技巧,不能每次插入一个值,因为维护 \(x\) 不方便。

所以考虑一个 \(cur\),每次对于新的 \(i\) 不能跳过时移动 \(cur\),然后队首无法到达出队,最后再取值。

请注意,初始化成 \(-INF\),保证不会从不合法的位置跳过来,否则50pts。

#include<iostream>
#include<cstring>
typedef long long ll;
using namespace std;
const int N=500010;
int n,d,k,x[N],s[N],q[N];
ll f[N];
void read(int &x){
    x=0;
    bool f=0;
    char c=getchar();
    while(!isdigit(c)){
        if(c=='-')f=1;
        c=getchar();}
    while(isdigit(c))x=x*10+c-'0',c=getchar();
    if(f)x=-x;
}
bool check(int g){
    ll ans=0;
    memset(f+1,-0x3f,n*8);
    int hh=0,tt=-1,l=max(d-g,1),r=d+g,cur=0;
    for(int i=1;i<=n;++i){
        while(cur<i&&x[cur]+l<=x[i]){
            while(hh<=tt&&f[q[tt]]<=f[cur])--tt;
            q[++tt]=cur;
            ++cur;
        }
        while(hh<=tt&&x[q[hh]]+r<x[i])++hh;
        if(hh<=tt)f[i]=f[q[hh]]+s[i];
        // printf("f[%d]=%d\n",i,f[i]);
        ans=max(ans,f[i]);
    }
    return ans>=k;
}
int main(){
    #ifdef LOCAL
    freopen("1.txt","r",stdin);
    #endif
    #ifndef LOCAL
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    #endif
    read(n);
    read(d);
    read(k);
    ll tot=0;
    for(int i=1;i<=n;++i)read(x[i]),read(s[i]),tot+=s[i]>0?s[i]:0;
    if(tot<k)return cout<<"-1\n",0;
    int l=0,r=1e9;
    while(l<r){
        int mid=l+r>>1;
        if(check(mid))r=mid;
        else l=mid+1;
    }
    cout<<r;
    // cout<<check(2);
    return 0;
}

标签:NOIP2017,跳房子,cur,int,ll,read,P3957,getchar
From: https://www.cnblogs.com/wscqwq/p/18319668

相关文章

  • 洛谷 P3954 [NOIP2017 普及组] 成绩
    本文由Jzwalliser原创,发布在CSDN平台上,遵循CC4.0BY-SA协议。因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。违者必究,谢谢配合。个人主页:blog.csdn.net/jzwalliser题目洛谷P3954[NOIP2017普及组]成绩[NOIP2017普及组]成绩题目背景......
  • CSP历年复赛题-P3957 [NOIP2017 普及组] 跳房子
    原题链接:https://www.luogu.com.cn/problem/P3957题意解读:有n个格子,每个格子有不同的距离和分数,从起点,每次可跳距离为d,用g金币后可跳距离范围可以变成max(d-g,1)~d+g,求最小的g,使得可跳跃得分不少于k。解题思路:1、单调性分析:如果g越大,可跳跃的范围就越大,理论上能得的分数越......
  • CSP历年复赛题-P3956 [NOIP2017 普及组] 棋盘
    原题链接:https://www.luogu.com.cn/problem/P3956题意解读:计算从(1,1)走到(m,m)的最小花费,有几个限定:同色格子可以走,花费为0;不同色格子可以走,花费为1;有色格子可以走到无色格子,花费为2,且用将无色格子临时染色;无色格子不能走到无色格子。解题思路:可以采用DFS来暴搜所有路径,需......
  • CSP历年复赛题-P3955 [NOIP2017 普及组] 图书管理员
    原题链接:https://www.luogu.com.cn/problem/P3955题意解读:给出n个图书编号,q个需求码,找到后缀与需求码匹配的最小图书编号,没有输出-1。解题思路:先对图书编号排序,用枚举法遍历每一个图书编号,看后缀是否与需求码相同。100分代码:#include<bits/stdc++.h>usingnamespacestd;c......
  • 【NOIP2017普及组复赛】题2:图书管理员
    题2:图书管理员【题目描述】图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数。每位借书的读者手中有一个需求码,这个需求码也是一个正整数。如果一本书的图书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。小......
  • P3953 [NOIP2017 提高组] 逛公园
    P3953[NOIP2017提高组]逛公园求有向图中\(1\)到\(n\)的路径中长度小于等于\(dis(1,n)+k\)的方案数。\(dis(1,n)\)表示最短路。\(k\le50\)。部分分\(k=0\),直接最短路计数即可。我们发现有向图中存在后效性,不好动态规划,但我们仔细思考后,在不存在\(0\)边的情况下,设......
  • P3956 [NOIP2017 普及组] 棋盘
    /*这题本身不难,但是我写难了就是一个bfs,没了但是我的写法恰好犯了一个错误hark数据35110211311220330答案是4而我能输出30-1-110-11-10原因是我先走到了(2,2)这时候......
  • [题解] <NOIP2017> 时间复杂度
    [题解]NOIP2017时间复杂度题目描述小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正......
  • P3956 [NOIP2017 普及组] 棋盘
    原题链接题解dijkstra算法的应用。相同颜色权值为0;不同颜色权值为1;有颜色到无颜色权值为2。其中不能连续两步走无颜色结点,即该情况需要特别考虑。code #include<bits/stdc++.h>usingnamespacestd;constintMAX=1e9;inta[105][105],dis[105][105],vis[105][105];int......
  • [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目
    这肯定是学证明了,看这篇文章补充一下细节首先,\(m\)的范围应该是\([0,b-1]\)然后,当\(m\)取不同值的时候,\(ma\)%\(b\)一定为不同值(这个性质确实有点奇特,可以记下来)反证,如果\(m_1a\equivm_2a\:(mod\:b)\)且\(0≤m_1<m_2≤b-1\),那么就有\(b|(m_2-m_1)a\),题目给出了\(a,b\)互质,......