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 << "
    ";
    }
    
    
    

  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/lipu123/p/12154345.html
Copyright © 2011-2022 走看看