Network Coverage

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 }

 

posted @ 2020-07-09 10:47  swsyya  阅读(221)  评论(0)    收藏  举报

回到顶部