链接:https://ac.nowcoder.com/acm/contest/3667/D
来源:牛客网
樱花飘落的速度,每秒五厘米。
动漫《秒速五厘米》中,明里曾在信中写道“我家附近有棵很大的樱花树,到了春天,那棵树上的花瓣,大概也会以每秒五公分的速度飘落,而我则在想,要是能和贵树一起迎接春天的来临该有多好啊。”
来年春天,他们没能像约定那样一起迎接春天的到来,看樱花飘落。但有一个魔法,可以让他们有m秒的时间一起看樱花飘落,樱花树上有n朵樱花,每朵樱花都有一个高度a[i],樱花飘落的速度为v,樱花只能一朵一朵的飘落,如果某朵樱花飘落的时间不是整数,则那朵樱花飘落所需的时间要向上取整,即,若两朵樱花的高度都为7,飘落的速度为2,则两朵樱花飘落的时间为8,现在你可以控制樱花飘落的速度v,当v为何值时才能使所有的樱花在m秒的时间内全部飘落且v的值要尽可能小。
输入描述:
第一行输入两个正整数n和m(1<=n<=m<=2000000)
第二行输入n个正整数a[i](1<=a[i]<=10000000),分别指的是每朵樱花的高度
输出描述:
输出一个正整数v,代表樱花最合适的速度
示例1
输出
复制2
解题思路:
这是一道标准的二分
AC代码1:
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;} typedef long long ll; const int maxn = 1e7+10; int a[maxn]; int n,m; int judge(int x){ ll t=0; for(int i=1;i<=n;i++){ t+=(a[i]+x-1)/x;//向上取整的意思 } if(t>m) return 0; else return 1; } int main() { cin>>n>>m; int l=1e7,r=1; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } int ans; while(l>=r){ int mid=(l+r)/2; if(judge(mid)){ ans=mid; l=mid-1; } else{ r=mid+1; } } printf("%d",ans); return 0; }
AC代码2:
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;} typedef long long ll; const int maxn = 1e7+10;int a[2002000], n, m; bool check(int x) { long long sum = 0; for(int i = 0; i < n; i++) { sum += (a[i] + x - 1) / x; } return sum <= m; } int main() { cin >> n >> m; for(int i = 0; i < n; i++) { cin >> a[i]; } int left = 1, right = 10000000; while(left < right) { int mid = (left + right) >> 1; if(check(mid)) { right = mid; } else { left = mid + 1; } } cout << left << " "; }