zoukankan      html  css  js  c++  java
  • 二分法 codevs 1432 总数统计

    codevs 1432 总数统计

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
     
    题目描述 Description

    给出n个数,统计两两之和小于k的方案数之和。

    输入描述 Input Description

    第一行一个数n,表示数字的个数;
    第二行到第n + 1行,每行一个不超过2,000,000,000的数k;
    第n + 2行一个数m,表示m个问题;
    第n + 3行到第n + m + 2行,每行一个数m,询问表示n中两两组合不超过m的组
    合的个数;

    输出描述 Output Description

    输出m行,每行对应一个答案

    样例输入 Sample Input

    3

    1

    2

    3

    2

    2

    3

    样例输出 Sample Output

    0

    1

    数据范围及提示 Data Size & Hint

    30%的数据1 ≤ n ≤ 100, 1 ≤ m ≤ 50, k ≤ 2000;
    100%的数据 1 ≤ n ≤ 10000, 1 ≤ m ≤ 100, k ≤ 2,000,000,000;

     1 /*之前写了个读入优化,怎么都是得30分,改成cin后,直接就过了。
     2 做法:二分:先将输入的数字排序,然后从前面向后循环,二分后面的区间,找出si+sj<k的最大值,那么i+1--j的数都满足要求,枚举每一个i,累加即可
     3 */
     4 #define N 10010
     5 #include<iostream>
     6 using namespace std;
     7 #include<cstdio>
     8 #include<algorithm>
     9 long long n,m;
    10 long long k,con[N];
    11 long long find_ans(int x)
    12 {
    13     int l=x+1,r=n,mid;
    14     while(l<=r)
    15     {
    16         mid=((l+r)>>1);
    17         if(con[x]+con[mid]>k)
    18         r=mid-1;
    19         else l=mid+1;
    20     }
    21     return l-x-1;
    22 }
    23 int main()
    24 {
    25     cin>>n; 
    26     for(int i=1;i<=n;++i)
    27       cin>>con[i];
    28     sort(con+1,con+1+n);
    29     cin>>m;
    30     long long ans;
    31     while(m--)
    32     {
    33         ans=0;
    34         cin>>k;
    35         for(int i=1;i<=n;++i)
    36          ans+=find_ans(i);
    37         cout<<ans<<endl;
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    与开发团队高效协作的8个小技巧
    9本java程序员必读的书(附下载地址)
    NPOI导出饼图到Excel
    EF6不支持sqlite Code First解决方案
    C#程序访问底层网络
    如何自己开发软件测试工具?
    .Net mvc 根据前台参数动态绑定对象
    在SSM框架里新增一个功能
    2018-10-12 例会总结
    2018-10-11 java从入门到放弃--方法
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5585753.html
Copyright © 2011-2022 走看看