zoukankan      html  css  js  c++  java
  • 秒速五厘米 (牛客二分题)

    链接: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 << "
    ";
    }
    
    
    

  • 相关阅读:
    蓝桥杯-带分数
    蓝桥杯-分红酒
    蓝桥杯-猜算式
    hdu2045不容易系列之(3)—— LELE的RPG难题
    蓝桥杯-奇怪的比赛
    linux应用之perl环境的安装(centos)
    linux应用之php开发环境lamp搭建(centos)
    linux应用之yum命令详解
    linux应用之用户管理相关命令
    linux应用之mysql数据库指定版本的yum安装(centos)
  • 原文地址:https://www.cnblogs.com/lipu123/p/12154345.html
Copyright © 2011-2022 走看看