洛谷 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 }

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

猜你喜欢

转载自www.cnblogs.com/handsome-zyc/p/11296614.html