zoukankan      html  css  js  c++  java
  • codevs 1725 探险 (二分)

    /*
    二分答案 
    这个题目要求“体力和最小的那个小组的所有人的体力和尽量大” 
    很明显我们二分最小体力 如果合法 逐渐放大 
    但是这里我们二分的是最小而不是最大
    所以累加的体力>=ans时 跳过当前体力i (可以认为把他归给了上一组)
    累加和=0 继续分组 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define ll long long
    #define maxn 30010
    #define inf 1000000000
    using namespace std;
    ll n,m,ans,a[maxn];
    bool can(ll x)
    {
        ll tot=0,s=0;
        for(int i=1;i<=n;i++)
          if(s+a[i]<x)s=s+a[i];
          else
            {
              s=0;tot++;
            }
        if(tot>=m)return 1;
        else return 0;
    }
    int main()
    {
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=n;i++)
          scanf("%lld",&a[i]);
        ll l=0,r=inf;
        while(l<=r)
          {
              ll mid=(l+r)/2;
              if(can(mid))
                {
                    l=mid+1;
                    ans=mid;
              }
            else r=mid-1;
          }  
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    布局管理器
    下拉列表框
    时间,日期选择器
    关于部分基本控件的使用
    关于Activity
    什么时候修改class
    JavaScript Break 和 Continue 语句
    JavaScript While 循环
    JavaScript For 循环
    JavaScript Switch 语句
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5546142.html
Copyright © 2011-2022 走看看