• D - Project Planning--二分


    D - Project Planning

    Time Limit: 2 sec / Memory Limit: 1024 MB

    Score : 400400 points

    Problem Statement

    KEYENCE has NN departments, where A_iAi​ employees belong to the ii-th department (1 \leq i \leq N)(1≤i≤N). No employee belongs to multiple departments.

    The company is planning cross-departmental projects. Each project will be composed of exactly KK employees chosen from KK distinct departments.

    At most how many projects can be made? No employee can participate in multiple projects.

    Constraints

    • 1 \leq K \leq N \leq 2 \times 10^51≤K≤N≤2×105
    • 1 \leq A_i \leq 10^{12}1≤Ai​≤1012
    • All values in input are integers.

    Input

    Input is given from Standard Input in the following format:

    NN KK
    A_1A1​ A_2A2​ \ldots… A_NAN​
    

    Output

    Print the maximum possible number of projects.


    Sample Input 1 Copy

    Copy

    3 3
    2 3 4
    

    Sample Output 1 Copy

    Copy

    2
    

    There can be two projects, each composed of three employees from distinct departments.


    Sample Input 2 Copy

    Copy

    4 2
    1 1 3 4
    

    Sample Output 2 Copy

    Copy

    4
    

    Sample Input 3 Copy

    Copy

    4 3
    1 1 3 4
    

    Sample Output 3 Copy

    Copy

    2

    =========================================================================

    数据范围小的话优先队列贪心是很容易理解的。但本题需要二分,或许用到的这个结论是很普遍,需要特殊记住的计数问题,那就是n个小组,每组k个物体,要求组内不能重复,那么最终判定条件是所有小于等于n(大于n取等于n)的个数要 >= n*k,也就是说,只要数量够了,一定能构造出来不重复n个序列,很不好想或者去证明,只能说是一个计数结论罢了

     注意r太大会爆掉,故我们取r=1e18/k,再乘k的时候就不会爆掉了,当然128位也是很方便。

    题目没一般说明我们都是在1e18内获取答案的

    1. # include
    2. # include
    3. # include
    4. # include
    5. # include
    6. # include
    7. # include
    8. # include
    9. # include
    10. # include
    11. using namespace std;
    12. typedef __int128 ll;
    13. __int128 read(){
    14. __int128 x=0,f=1;
    15. char ch=getchar();
    16. while(!isdigit(ch)&&ch!='-')ch=getchar();
    17. if(ch=='-')f=-1,ch=getchar();
    18. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    19. return f*x;
    20. }
    21. void print(__int128 x){
    22. if(x<0)putchar('-'),x=-x;
    23. if(x>9)print(x/10);
    24. putchar(x%10+'0');
    25. }
    26. ll a[200000+10];
    27. ll k,n;
    28. bool check(ll mid)
    29. {
    30. ll sum=0;
    31. for(int i=1;i<=n;i++)
    32. {
    33. sum+=min(mid,a[i]);
    34. }
    35. return mid*k<=sum;
    36. }
    37. int main()
    38. {
    39. n=read();
    40. k=read();
    41. for(int i=1;i<=n;i++)
    42. {
    43. a[i]=read();
    44. }
    45. ll l=1,r=1e18;
    46. while(l<=r)
    47. {
    48. ll mid=(l+r)>>1;
    49. if(check(mid))
    50. l=mid+1;
    51. else
    52. r=mid-1;
    53. }
    54. print(r);
    55. return 0;
    56. }

  • 相关阅读:
    Vue-2.6Vue异步更新和$nextTick
    【前端性能优化指南】首屏加载优化、内存泄漏、CSS页面性能优化、CSS Sprites等
    Web前端:如何提高React Native App的性能?
    这个开学季,注定不平凡
    三维度:专业、展现与连接
    Zabbix技术分享——如何配置SNMPTrap监控
    盘点CSV文件在Excel中打开后乱码问题的三种处理方法
    魔百盒CM201-2-CH-Hi3798MV300-300H-EMMC和NAND_红外蓝牙语音_通刷固件包
    交互与前端10 Tabulator+Flask开发日志007
    简单介绍动态链接过程
  • 原文地址:https://blog.csdn.net/jisuanji2606414/article/details/126116484