Codeforces 702C Cellular Network

題目:這裏ios

題意:一條數軸上,有n個城市和m個塔,分別給出城市的位置和塔的位置,每一個塔有個覆蓋範圍,問能將全部城市都覆蓋的塔的最小範圍是多少,一個城市只要被至少一個塔spa

覆蓋就行。code

 

能夠利用貪心的思想模擬一下,注意一下細節就行,也能夠二分。blog

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<map>
 6 using namespace std;
 7 
 8 typedef long long ll;
 9 const int M = 1e5 + 10;
10 int a[M],b[M];
11 ll max(ll x,ll y){return x>y?x:y;}
12 
13 int main()
14 {
15     int n,m;
16     scanf("%d%d",&n,&m);
17     for (int i=1 ; i<=n ; i++) scanf("%d",&a[i]);
18     for (int i=1 ; i<=m ; i++) scanf("%d",&b[i]);
19     if (a[1]>=b[m])
20     {
21         printf("%I64d\n",(ll)(a[n]-b[m]));
22         return 0;
23     }
24     if (b[1]>=a[n])
25     {
26         printf("%I64d\n",(ll)(b[1]-a[1]));
27         return 0;
28     }
29     int j=1;ll ans=0;
30     for (int i=1 ; ; i++)
31     {
32          bool flag=false;
33          if (i>m) i=m;
34          while (i!=1&&abs(a[j]-b[i])>=abs(a[j]-b[i-1])&&j<=n)
35             j++,flag=true;
36          if (flag) ans=max(ans,abs(a[j-1]-b[i-1]));
37          if (j==n+1) break;
38          ll dis=abs(b[i]-a[j]);
39          while (abs(b[i]-a[j])<=dis&&i<=m)
40             dis=abs(b[i]-a[j]),i++;
41          i--;
42          while (abs(a[j]-b[i])<=dis&&j<=n)
43             j++;
44          ans=max(ans,dis);
45          //cout<<ans<<endl;
46          if (j==n+1) break;
47     }
48     printf("%I64d\n",ans);
49     return 0;
50 }

 

二分get

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<map>
 6 using namespace std;
 7 
 8 typedef long long ll;
 9 const int M = 1e5 + 10;
10 ll a[M],b[M],n,m;
11 ll max(ll x,ll y){return x>y?x:y;}
12 
13 bool judge(ll x)
14 {
15     int j=1;
16     for (int i=1 ; i<=m ; i++)
17     {
18         while (a[j]>=b[i]-x&&a[j]<=b[i]+x&&j<=n)
19             j++;
20         if (j==n+1) return true;
21     }
22     return false;
23 }
24 
25 ll sreach ()
26 {
27     ll l=0,r=3e9,ans=0;
28     while (l<=r)
29     {
30         ll mid=(l+r)/2;
31         if (judge(mid)) ans=mid,r=mid-1;
32         else l=mid+1;
33     }
34     return ans;
35 }
36 
37 int main()
38 {
39     scanf("%d%d",&n,&m);
40     for (int i=1 ; i<=n ; i++) scanf("%I64d",&a[i]);
41     for (int i=1 ; i<=m ; i++) scanf("%I64d",&b[i]);
42     if (a[1]>=b[m])
43     {
44         printf("%I64d\n",(ll)(a[n]-b[m]));
45         return 0;
46     }
47     if (b[1]>=a[n])
48     {
49         printf("%I64d\n",(ll)(b[1]-a[1]));
50         return 0;
51     }
52 
53     printf("%I64d\n",sreach());
54     return 0;
55 }
相關文章
相關標籤/搜索