题意:有 (n) 个城市围成一圈,第 (i) 个城市有 (a_{i}) 个网络需求,每个城市建有一个网络站,第 (i) 个城市的网络站可以提供 (b_{i}) 个网络需求;且 第 (i) 个城市的网络站只能提供需求给第 (i)和 (i+1) 个城市 (left ( n+1=1 ight )),是否存在合理分配使得所有城市的所有需求都被满足
解题思路:
当一个城市的网络站的提供给第一个城市的设备数(left ( 这里假设分了x个 ight ))确定之后 , 剩下的城市就可以通过贪心来分配;
(x) 越大 , 第 (2到n) 个城市可能被分配的个数就会减少,可能会造成断流,某个城市得不到足够的分配
(x)如果太小的话,第 (n) 个城市网络站给第一个城市分配的设备数加上 (x) 就可能小于 (a_{1}) ,
所以(x)必须是在一定范围内的,那么我们就可以二分(x),
当第 (2到n) 个城市不够分配时 , 我们让 r= mid - 1
当第 (n) 个城市网络站给第一个城市分配的设备数 + (x) < (a_{1}) 时 ,l = mid + 1
AC_Code:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 1e6+5; 5 6 int n,a[maxn],b[maxn]; 7 8 int judge(int mid){ 9 int pre=b[1]-mid; 10 for(int i=2;i<=n;i++){ 11 int f=a[i]-pre; 12 f=max(0,f);//有可能pre比a[i]多,但是pre多出来的不能再用了; 13 int ff=b[i]-f; 14 pre=ff; 15 if( pre<0 ) return -1;//中间断流了,第一个分多了 16 } 17 if( pre+mid<a[1] ) return 0;//第一个分少了 18 else return 1; 19 } 20 21 int main() 22 { 23 ios::sync_with_stdio(false); 24 int t; 25 cin>>t; 26 while( t-- ){ 27 cin>>n; 28 for(int i=1;i<=n;i++) cin>>a[i]; 29 for(int i=1;i<=n;i++) cin>>b[i]; 30 int l=0,r=b[1],flag=0; 31 while( l<=r ){ 32 int mid=(l+r)>>1; 33 if( judge(mid)==-1 ) r=mid-1; 34 else if( judge(mid)==0 ) l=mid+1; 35 else{ 36 flag=1; 37 break; 38 } 39 } 40 if( !flag ) cout<<"NO "; 41 else cout<<"YES "; 42 } 43 return 0; 44 }