Network Coverage
题意:有 \(n\) 个城市围成一圈,第 \(i\) 个城市有 \(a_{i}\) 个网络需求,每个城市建有一个网络站,第 \(i\) 个城市的网络站可以提供 \(b_{i}\) 个网络需求;且 第 \(i\) 个城市的网络站只能提供需求给第 \(i\)和 \(i+1\) 个城市 \(\left ( n+1=1\right )\),是否存在合理分配使得所有城市的所有需求都被满足
解题思路:
当一个城市的网络站的提供给第一个城市的设备数\(\left ( 这里假设分了x个\right )\)确定之后 , 剩下的城市就可以通过贪心来分配;
\(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\n"; 41 else cout<<"YES\n"; 42 } 43 return 0; 44 }