二分,最大化最小值(分块)
题意:
给出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) << "\n" 45 #define endl "\n" 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 */