1 solutions

  • 0
    @ 2024-12-8 14:13:55
    #include<cstdio>
    typedef long long ll;//不开long long 见祖宗。。。
    ll l,r,c,start ;
    ll  n ,a[100005],b[100009];
     bool check(ll x)//一定要注意!!!不要转换类型错了!!!
    {
    	ll sum = 0;
    	for(int i = 1;i <= n;i++)
    	{
    		if(b[i] > x)continue;
    	    else if(b[i] < start)
    		{
    			sum +=  (x - b[i])/a[i] - (start - 1 - b[i])/a[i];//start应该包含在里面,减去start-1以及前的区间
    		}
    		else sum += (x-b[i])/a[i] + 1;
    		//加一是当时开始亮的时候也要算一次
    		
    		if(sum >= c)return true;
    	}
    	
    	return false;
    }
    int main()
    {
    	
    	scanf("%lld",&n);
    	for(int i = 1;i <= n;i++)
    	{
    		scanf("%lld",&b[i]);
    	}
    	for(int i = 1;i <= n;i++)
    	{
    		scanf("%lld",&a[i]);
    	}
    	
    	
    	scanf("%lld%lld%lld",&l,&r,&c);
    	start = l;
        ll mid = 0;//救命,开的int一不小心就超时,改了我好久,可恶。。。。
    	while(l < r)//这里是一个从小到大的隐藏条件
    	{//举个例子:其中check(l+3)表示从l——l+3,这个区间里面的计数
    	 //并且,因为是闪一下记一次,check(l+4)肯定是不小于check(l+3)的
    	  //所以这一定是个递增的序列,我们就可以用二分啦!!!
    		 mid = l+ r>>1;
    		if(check(mid))r = mid;
    		else l = mid+1;
    		
    	}
    	if(check(l))printf("%lld",l);//判断一下这个数是否 >=c 
    	else puts("-1");
    	return 0;
    }
    
    • 1

    Information

    ID
    7004
    Time
    500ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    # Submissions
    70
    Accepted
    5
    Uploaded By