秒速五厘米 (牛客二分题)

链接: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 10
5 6

输出

复制
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 << "\n";
}
复制代码

 


posted @   lipu123  阅读(274)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示