1 solutions
-
0
#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