HDU 5101 Select(BestCoder Round #17)

Problem Description:
One day, Dudu, the most clever boy, heard of ACM/ICPC, which is a very interesting game. He wants to take part in the game. But as we all know, you can't get good result without teammates.
So, he needs to select two classmates as his teammates. 
In this game, the IQ is very important, if you have low IQ you will WanTuo. Dudu's IQ is a given number k. We use an integer v[i] to represent the IQ of the ith classmate. 
The sum of new two teammates' IQ must more than Dudu's IQ.
For some reason, Dudu don't want the two teammates comes from the same class.
Now, give you the status of classes, can you tell Dudu how many ways there are.
 
Input:
There is a number T shows there are T test cases below. ( T20)
For each test case , the first line contains two integers, n and k, which means the number of class and the IQ of Dudu. n ( 0n1000 ), k( 0k<231 ).
Then, there are n classes below, for each class, the first line contains an integer m, which means the number of the classmates in this class, and for next m lines, each line contains an integer v[i], which means there is a person whose iq is v[i] in this class. m( 0m100 ), v[i]( 0v[i]<231 )
 
Output:
For each test case, output a single integer.
 
Sample Input:
1
3 1
1 2
1 2
2 1 1
 
Sample Output:
5
 
题意:一个很聪明的ACMer,现在他需要两个队友(这两个队友的智商之和必须大于他的智商,且这两个人不在同一个班)去参加ICPC,现在给出的他的智商k,和班级的个数n,每个班级的人数m,以及每个人中每个人的智商a[i],求出他可以做出的选择数。
 
分析:我们知道将所有人统计在一个数组b中,然后排序后二分查找可以和b[i]一起组队的人数,所有的加起来就是所有的选择数ans2,但是这里面包含了同班同学,所以我们要找到每个人在每个班中组队的个数ans1,那么最终能够达到这个人要求的个数为ans2-ans1。
 
这里用到新的二分查找(都是在排序之后的查找):lower_bound(a,a+n,x)- a,它的含义是从数组a中(下标从0~n-1)查找大于等于x的第一个数的位置,如果x在数组a中,那么返回第一个x的位置,如果a中 不存在x,返回x可以插入的位置(插入之后排序不变);
upper_bound(a,a+n,x)- a,它的含义是从数组a中(下标从0~n-1)查找大于等于x的最后一个数的位置,如果x在数组a中,那么返回最后一个x的位置,如果a中不存在x,返回x可以插入的位置(插入之后排序不变)。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

const int N=1e6+10;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;

typedef long long LL;

LL a[110], b[N];

int main ()
{
    int T, n, m, i, j, num, idex;
    LL k, ans1, ans2;

    scanf("%d", &T);

    while (T--)
    {
        num = ans1 = ans2 = 0;

        scanf("%d %lld", &n, &k);

        for (i = 0; i < n; i++)
        {
            scanf("%d", &m);

            for (j = 0; j < m; j++)
            {
                scanf("%lld", &a[j]);
                b[num++] = a[j];
            }

            sort(a, a+m);

            for (j = 0; j < m; j++)
            {
                idex = upper_bound(a+j, a+m, k-a[j])-a; ///大于k-a[j]就可以与a[j]组队了
                ans1 += m-idex+1; ///计算每个班里的人可以与之组队的人数
            }
        }

        sort(b, b+num);

        for (i = 0; i < num; i++)
        {
            idex = upper_bound(b+i, b+num, k-b[i])-b;
            ans2 += num-idex+1; ///计算每个人可以与之组队的人数
        }

        printf("%lld\n", ans2-ans1);
    }

    return 0;
}

转载于:https://www.cnblogs.com/syhandll/p/4936971.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值