1 条题解

  • 1
    @ 2024-10-3 17:41:06

    厮。。。

    这题本身不难,难的是要想到用双二分:

    • 第一个二分:求打败所有怪的最小战力

    • 第二个二分:分训练的天数。

      代码来喽(我知道你们只想看这里)

    #include<bits/stdc++.h>
    const int N=2e5+5;
    typedef long long ll;
    using namespace std;
    ll n,m,x,pw;
    struct node{
    	ll a;
    	ll b;
    };node aa[N]; 
    
    int cmp(node x,node y){
    	return x.a<y.a;
    }
    
    int check1(ll mid){
    	for(int i=0;i<n;i++){
    		if(mid>aa[i].a) mid+=aa[i].b;
    		else return 0;
    	}
    	return 1;
    }
    
    int check2(ll mid,ll x,ll pw){
    	ll cnt=x;
    	if(mid%2) cnt+=(mid/2)*(mid/2+1) + mid/2+1;
    	else cnt+=(mid/2)*(mid/2+1);
    	return cnt>=pw;
    }
    
    int main(){
    	freopen("road.in","r",stdin);
    	freopen("road.out","w",stdout);
    	cin>>n;
    	for(int i=0;i<n;i++){
    		cin>>aa[i].a;
    	}
    	for(int i=0;i<n;i++){
    		cin>>aa[i].b;
    	}
    	sort(aa,aa+n,cmp);
    	ll l=0,r=1e9;
    	while(l<r){
    		ll mid=(l+r)/2;
    		if(check1(mid)) r=mid;
    		else l=mid+1;
    	}
    	pw=l;
    	cin>>m;
    	while(m--){
    		cin>>x;
    		ll l=0,r=1e9;
    		while(l<r){
    			ll mid=(l+r)/2;
    			if(check2(mid,x,pw)) r=mid;
    			else l=mid+1;
    		}
    		cout<<l<<" ";
    	}
    	return 0; 
    }
    

    不点赞(绿色的)就走??扔出去!!

    
    
    • 1

    信息

    ID
    774
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    61
    已通过
    16
    上传者