每日一题 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 }
请各位大佬斧正(反正我不认识斧正是什么意思)