• Code Forces Gym 100886J Sockets(二分)


    J - Sockets

        Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

    Valera has only one electrical socket in his flat. He also has m devices which require electricity to work. He's got n plug multipliers to plug the devices, the i-th plug multiplier has ai sockets.

    A device or plug multiplier is supplied with electricity if it is either plugged into the electrical socket, or if it is plugged into some plug multiplier which is supplied with electricity.

    For each device j, Valera knows the safety value bj which is the maximum number of plug multipliers on the path between the device and the electrical socket in his flat. For example, if bj = 0, the device should be directly plugged into the socket in his flat.

    What is the maximum number of devices Valera could supply with electricity simultaneously? Note that all devices and plug multipliers take one socket to plug, and that he can use each socket to plug either one device or one plug multiplier.

    Input

    The first line contains two space-separated integers n and m (1 ≤ n, m ≤ 2·105), the number of plug multipliers and the number of devices correspondingly.

    The second line contains n space-separated integers a1a2..., an (2 ≤ ai ≤ 2·105). Here, the number ai stands for the number of sockets on the i-th plug multiplier.

    The third line contains m space-separated integers b1b2..., bm (0 ≤ bj ≤ 2·105). Here, the number bj stands for the safety value of the j-th device.

    Output

    Print a single integer: the maximum number of devices that could be supplied with electricity simultaneously.

    Sample Input

    Input

    3 5
    3 2 2
    1 2 2 1 1

    Output

    4

    Input

    3 3
    2 2 2
    1 2 2

    Output

    3

    题意:给你N个插排,a[i]代表第i个插排上面插孔的个数;接着给你M个电器,b[i]代表第i个电器最多能承受的级联层数,然后让你求出最多能有个电器同时工作?
    题解:贪心+二分,插排按插孔的个数从大到小排序,电器按所能承受的级联层数从大到小排序,接着在[1,m]的区间内二分答案即可。
    二分的判断主要是看当前区间内(1,mid)的电器能否全部都插在插排上面,如果满足条件,就把当前的mid记录下来。
    代码:
     1 #include <iostream>
     2 #include <queue>
     3 #include <stack>
     4 #include <cstdio>
     5 #include <vector>
     6 #include <map>
     7 #include <set>
     8 #include <bitset>
     9 #include <algorithm>
    10 #include <cmath>
    11 #include <cstring>
    12 #include <cstdlib>
    13 #include <string>
    14 #include <sstream>
    15 #define push_back pb
    16 #define make_pair mp
    17 #define lson l,m,rt*2
    18 #define rson m+1,r,rt*2+1
    19 #define mt(A) memset(A,0,sizeof(A))
    20 #define mod 1000000007
    21 using namespace std;
    22 typedef long long LL;
    23 const int N=200000+10;
    24 const LL INF=0x3f3f3f3f3f3f3f3fLL;
    25 LL a[N],b[N],n,m;
    26 bool check(LL num)//判断(1.num)内的电器能否全部工作
    27 {                                //cnt代表的是当前还没有工作的电器的个数
    28     LL cnt=num,i=1,tot=1,step=0;//step代表级联的层数,初始状态当然为0;
    29     while(true)                 //tot代表的是当前剩余的插孔的个数
    30     {
    31         while(cnt>=1&&b[cnt]<=step)//如果电器的级联层数满足条件,就插上插排
    32         {
    33               cnt--;tot--;
    34         }
    35         if(cnt<1&&tot>=0)return true;//如果电器插完了,插孔>=0,那说明(1,num)是满足的
    36         if(tot<0)return false;//插孔<0说明不满足
    37         LL newtot=0;
    38         while(tot&&i<=n)//更新插孔的个数
    39         {
    40              newtot+=a[i++];
    41              tot--;
    42         }
    43         tot+=newtot;
    44         step++;//级联层数每次增加一层
    45     }
    46 }
    47 int main()
    48 {
    49 #ifdef Local
    50     freopen("data","r",stdin);
    51 #endif
    52     LL i,j,k,l,r,mid,ans;
    53     cin>>n>>m;
    54     for(i=1;i<=n;i++)cin>>a[i];
    55     for(i=1;i<=m;i++)cin>>b[i];
    56     sort(a+1,a+n+1,greater<LL>());
    57     sort(b+1,b+m+1,greater<LL>());
    58     l=1;r=m;
    59     while(l<=r)
    60     {
    61         mid=(l+r)/2;
    62         if(check(mid))
    63         {
    64             ans=mid;//记录答案
    65             l=mid+1;
    66         }
    67         else r=mid-1;
    68     }
    69     cout<<ans<<endl;
    70     return 0;
    71 }
    View Code
     
  • 相关阅读:
    差分约束
    DevOps系列【centos 7离线安装中文版GitLab】
    Linux系列【硬盘的插入、分区、格式化、挂载】
    并发编程系列【ThreadLocal】
    Linux系列【从一台linux通过ssh登录另一台linux服务器】
    idea系列【配置git忽略文件和目录规则】
    网络编程系列【文件上传(C/S)】
    常见的问题系列【tar: Error is not recoverable: exiting now】
    网络编程系列【TCP通信原理】
    DevOps系列【Jenkinsfile+Dockerfile+nginx+vue】
  • 原文地址:https://www.cnblogs.com/27sx/p/5837216.html
Copyright © 2020-2023  润新知