hdu 5101(思路题)

Select

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1599    Accepted Submission(s): 443

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. (T≤20)
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 ( 0≤n≤1000 ), k( 0≤k<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( 0≤m≤100 ), v[i]( 0≤v[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

Source

BestCoder Round #17

题意:dudu要在不同班级里面选择两名队友参加ACM,如果两名队友的IQ1+IQ2>k (k是dudu的IQ),那么就可以选择这两名队友参赛。问总共有多少种选法。

题解:对于某个班级,假设第 j 个人的IQ是 v,那么对应这个人可以找到的队友数等于 在所有班级里面找到 IQ>k-v 的人 - 在本班找到 IQ > K-v 的人 把这些全部加起来就好了。

用一个数组记录所有班级的人IQ,然后从小到大排序,二分查找大于等于 k-v 的第一个人的位置。这里可以使用 lower_bound 来进行二分查找。最后结果要除以二,因为算重了。

时间复杂度O(n*m*log(n*m))

lower_bound:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1005;
const int M = 105;
int v[M];
int v1[N*M];
int sum[N];
struct Node{
    int num;
    int v[N];
}node[N];
int main(){
    int tcase,n;
    int k;
    scanf("%d",&tcase);
    while(tcase--){
        scanf("%d%d",&n,&k);
        int cnt = 1;
        for(int i=1;i<=n;i++){
            scanf("%d",&node[i].num);
            sum[i] = sum[i-1]+node[i].num;
            for(int j=1;j<=node[i].num;j++){
                scanf("%d",&v[j]);
                v1[cnt++] = v[j];
            }
            sort(v+1,v+node[i].num+1);
            for(int j=1;j<=node[i].num;j++){
                node[i].v[j] = v[j];
            }
        }
        sort(v1+1,v1+cnt);
        long long ans = 0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=node[i].num;j++){
                int v = node[i].v[j];
                int pos1 = node[i].v+node[i].num+1 - lower_bound(node[i].v+1,node[i].v+1+node[i].num,k-v+1);
                int pos2 = v1+cnt - lower_bound(v1+1,v1+cnt,k-v+1);
                ans += pos2-pos1;
            }
        }
        printf("%lld\n",ans/2);
    }
    return 0;
}
时间: 2024-11-08 21:53:21

hdu 5101(思路题)的相关文章

hdu 4908(思路题)

BestCoder Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1614    Accepted Submission(s): 566 Problem Description Mr Potato is a coder.Mr Potato is the BestCoder. One night, an amazing

hdu 5063(思路题-反向操作数组)

Operation the Sequence Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 842    Accepted Submission(s): 288 Problem Description You have an array consisting of n integers: a1=1,a2=2,a3=3,…,an=n. T

hdu 5400(思路题)

Arithmetic Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1445    Accepted Submission(s): 632 Problem Description A sequence b1,b2,?,bn are called (d1,d2)-arithmetic sequence if and on

hdu 4859(思路题)

Goffi and Squary Partition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1171    Accepted Submission(s): 402 Problem Description Recently, Goffi is interested in squary partition of integers.

HDU 5301 思路题

给出n*m的矩阵,里面有一个坏点,不覆盖这个坏点的矩阵填满n*m的矩阵,使得这些矩阵的最大面积最小,并输出最小面积 先把矩阵转换为n<=m的矩阵,并把坏点通过镜像转移到左上方 ans=MAX(矩阵最中心点到两边距离的最小值,MIN(坏点下方的点到矩阵左端和下端的最小值)); #include "stdio.h" #include "string.h" int ans,n,m,x,y; int Max(int a,int b) { if (a<b) ret

hdu 4416 水题 浙大计算机研究生复试上机考试-2005年 可是发现自己写代码有问题

Spring3与Hibernate4整合时出现了nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider. hibernate3的时候,用spring来控制sessionfactory用的可以是org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,因为用的是hibernate4所以照猫画

51nod P1305 Pairwise Sum and Divide ——思路题

久しぶり! 发现的一道有意思的题,想了半天都没有找到规律,结果竟然是思路题..(在大佬题解的帮助下) 原题戳>>https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1305<< 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = 0 for i = 1 to A.length for j = i+1 to A.length sum = sum + Floor(

hdu 2837 坑题。

Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1414    Accepted Submission(s): 291 Problem Description Assume that f(0) = 1 and 0^0=1. f(n) = (n%10)^f(n/10) for all n bigger than ze

hdu 4883 思维题

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4883 TIANKENG’s restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 566    Accepted Submission(s): 267 Problem Description TIANKENG manages a