赞
踩
本题解法多,这里介绍用二分答案。
首先复现一下二分板子,这里只介绍该题用到的。
该题中,minAns是每块区域的最少开垦天数。maxAns是开垦天数的最大值1e5。
接下来是check函数
考虑二分得到的答案x,在函数内统计该答案下所耗费的总资源数sum,即(每块耕地的资源-x)*投入资源数量。如果总资源数sum<=m,返回true,否则返回false。
算法总的时间复杂度为O(nlogm)
具体代码:
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn=100005;
- const int INF=1e9;
- typedef long long ll;
- int n,k,ans,maxt;
- ll m;
- struct node{
- int t,c,cnt;
- }a[maxn];
-
- bool check(int x){
- ll sum=0;
- for(int i=1;i<=n;i++){
- sum += (max(0,a[i].t-x))*a[i].c;
- }
- if(sum <= m)return true;
- return false;
- }
-
- int main() {
- cin>>n>>m>>k;
- for(int i=1;i<=n;i++){
- cin>>a[i].t>>a[i].c;
- maxt=max(maxt,a[i].t);
- }
- int l=k,r=1e5+5;
- while(l<=r){
- int mid=l+(r-l)/2;
- if(check(mid)){
- ans = mid;
- r=mid-1;
- }
- else l=mid+1;
- }
- cout<<ans;
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。