总数统计

来源:互联网 发布:手机定位考勤软件 编辑:程序博客网 时间:2024/05/02 01:46
【题目描述】

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

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

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

【样例输入】

3

1

2

3

2

2

3

【样例输出】

0

1

【数据范围及提示】

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

源代码:#include<cstdio>#include<algorithm> //第一次用sort。using namespace std;long long m,n,i[10001]; //不开Long Long会死人的!void x2(long long t){    int left=1,right=n,num(0),ans(0);    while (left<=right) //二分查找最大的i[]。    {        int mid=(left+right)/2;        if (i[mid]<=t)        {            left=mid+1;            num=mid;        }        else          right=mid-1;    }    for (int a=1;a<=num;a++)    {        int k(0);        left=1;        right=a-1;        while (left<=right) //二分查找能够与i[a]匹配的最大的i[]。        {            int mid=(left+right)/2;            if (i[mid]+i[a]<=t)            {                left=mid+1;                k=mid;            }            else              right=mid-1;        }        ans+=k; //此节点前面的节点自然都符合条件,累加。    }    printf("%d\n",ans);}int main() //二分法。{    scanf("%d",&n);    for (int a=1;a<=n;a++)      scanf("%d",&i[a]);    sort(i+1,i+n+1); //升序排列。    scanf("%d",&m);    for (int a=1;a<=m;a++)    {        long long t; //恶心的Long Long。        scanf("%d",&t);        x2(t);    }    return 0;}
0 0
原创粉丝点击