Network Coverage

Network Coverage

 

 题意:有 (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 }
原文地址:https://www.cnblogs.com/wsy107316/p/13272290.html