zoukankan      html  css  js  c++  java
  • 洛谷 P2678 跳石头 题解

    每日一题 day2 打卡

    Analysis

    一开始想到差分数组维护路径长度,但去掉一个点很麻烦,感觉不可做。

    转念一想(其实我看了算法标签)是一个二分答案裸题,每次判断有没有超过m个比mid大就行了。

    注意:二分判断答案合法后要储存答案,不能无脑输出l或r,不然只有70分。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define maxn 50010
     6 #define INF 2147483647
     7 using namespace std;
     8 inline int read()
     9 {
    10     int x=0;
    11     bool f=1;
    12     char c=getchar();
    13     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
    14     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    15     if(f) return x;
    16     return 0-x;
    17 }
    18 inline void write(int x)
    19 {
    20     if(x<0){putchar('-');x=-x;}
    21     if(x>9)write(x/10);
    22     putchar(x%10+'0');
    23 }
    24 int end,n,m,ans;
    25 int d[maxn];
    26 inline bool check(int x)
    27 {
    28     int now=0,num=0;
    29     for(int i=1;i<=n+1;i++)
    30     {
    31         if(x>d[i]-d[now]) num++;
    32         else now=i;
    33     }
    34     if(num>m)return false;
    35     return true;
    36 }
    37 int main()
    38 {
    39     end=read();n=read();m=read();
    40     for(int i=1;i<=n;i++) 
    41     {
    42         d[i]=read();
    43     }
    44     d[n+1]=end;
    45     int l=0,r=end,mid=0;
    46     while(l<=r)
    47     {
    48         mid=(l+r)/2;
    49         if(check(mid)==true) 
    50         {
    51             ans=mid;
    52             l=mid+1;
    53         }
    54         else r=mid-1;
    55     }
    56     write(ans);
    57     return 0; 
    58 }

    请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    交换实验
    路由引入和控制
    ISIS
    BGP联盟
    BGP2
    bgp
    Linux日常总结
    配置本地yum源方法
    达梦数据库常见问题-安装
    达梦数据库常见问题-安装
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/11296614.html
Copyright © 2011-2022 走看看