• 二分,最大化最小值(分块)


    题意:

      给出n个任务,每个任务有它需要花费的时间,每做完m个任务就要休息等同于做完这m个任务所需要的时间的时间

      求出一个值d,表示只有花费的时间<=d的任务才会被完成

      在符合d的条件下,任务需要按照初始的顺序依次完成

      给出总时间t,要求做完任务的时间(包括休息时间)要<=t,若完成了最后想要完成的任务后需要休息时,可以不休息,但也不能再做任务了

      求出一个d,使得能做完的任务尽量多,求出最大可完成任务数和任意一个能得到最大可完成任务数的d值

    solution:

      发现这个阈值好像并不好二分(也许是可以的?),但是又发现完成的数量越多阈值肯定是越小,因为这题里难度=完成时间,这是有单调性的,可以二分!

      二分后如何检查?我们先不考虑时间限制,只是考虑做完这些任务,发现将任务排序后第midmid个就是我们要的阈值!那么就按题意模拟然后看看是否超时即可, 

      注意做够midmid个任务我们就不用做了,还有d是正整数=。=......还有就是注意细节啊

      所以你就把数组开小又没开long long贡献了一个WA+一个RE?

      注意数组从1开始,0的值设置为1

     1 /*************************************************************************
     2     > File Name: a.cpp
     3     > Author: QWX
     4     > Mail: 
     5     > Created Time: 2018/10/27 15:26:46
     6  ************************************************************************/
     7 
     8 
     9 //{{{ #include
    10 #include<iostream>
    11 #include<cstdio>
    12 #include<algorithm>
    13 #include<vector>
    14 #include<cmath>
    15 #include<queue>
    16 #include<map>
    17 #include<set>
    18 #include<string>
    19 #include<cstring>
    20 #include<complex>
    21 #include<cassert>
    22 //#include<bits/stdc++.h>
    23 #define vi vector<ll>
    24 #define pii pair<ll,ll>
    25 #define mp make_pair
    26 #define pb push_back
    27 #define fi first
    28 #define se second
    29 #define pw(x) (1ll << (x))
    30 #define sz(x) ((ll)(x).size())
    31 #define all(x) (x).begin(),(x).end()
    32 #define rep(i,l,r) for(ll i=(l);i<(r);i++)
    33 #define per(i,r,l) for(ll i=(r);i>=(l);i--)
    34 #define FOR(i,l,r) for(ll i=(l);i<=(r);i++)
    35 #define cl(a,b) memset(a,b,sizeof(a))
    36 #define fastio ios::sync_with_stdio(false);cin.tie(0);
    37 #define lson l , mid , ls
    38 #define rson mid + 1 , r , rs
    39 #define INF 0x3f3f3f3f
    40 #define LINF 0x3f3f3f3f3f3f3f3f
    41 #define ll long long
    42 #define ull unsigned long long
    43 #define dd(x) cout << #x << " = " << (x) << "," 
    44 #define de(x) cout << #x << " = " << (x) << "
    " 
    45 #define endl "
    "
    46 using namespace std;
    47 //}}}
    48 
    49 const ll N=2e5+7;
    50 ll n,m,k;
    51 ll a[N],b[N];
    52 bool check(ll x)
    53 {
    54     ll t=b[x];
    55     ll tot=0,cnt=0,ans=0,res=0;
    56     FOR(i,1,n){
    57         if(a[i]<=t){
    58             ans+=a[i],res+=a[i],cnt++,tot++;
    59             if(tot>=x)return ans<=k;
    60             if(cnt==m)cnt=0,ans+=res,res=0;
    61         }
    62 //        dd(a[i]),de(ans);
    63     }
    64     return ans<=k;
    65 }
    66 
    67 int main()
    68 {
    69     fastio;
    70     ll T; cin>>T;
    71     while(T--){
    72         cin>>n>>m>>k;
    73         b[0]=1;
    74         FOR(i,1,n)cin>>a[i],b[i]=a[i];
    75         sort(b+1,b+n+1);
    76         ll l=0,r=n;
    77         ll ans=0;
    78 //        de(b[4]);de(check(4));
    79         while(l<=r){
    80             ll mid=l+r>>1;
    81             if(check(mid))l=mid+1,ans=mid;
    82             else r=mid-1;
    83         }
    84 //        de(b[0]);
    85         cout<<ans<<" "<<b[ans]<<endl;
    86     }
    87     return 0;
    88 }
    89 /*
    90 1
    91 11 1 29
    92 6 4 3 7 5 3 4 7 3 5 3
    93 */
    View Code
  • 相关阅读:
    机器学习(二)分类决策树
    机器学习(一):朴素贝叶斯
    NLP(五):关键词提取补充(语料库和向量空间)
    oracle变量的定义和使用【转】
    一些开发技巧和工具使用心得
    醒狮赋
    C# 字符串的截取和替换
    C# 判断字符串是否为日期格式
    重装系统
    电脑桌面所有图标消失
  • 原文地址:https://www.cnblogs.com/klaycf/p/9865865.html
Copyright © 2020-2023  润新知