8628 相亲

8628 相亲

时间限制:500MS  内存限制:1000K
提交次数:409 通过次数:81

题型: 编程题   语言: G++;GCC

 

Description

    在咱遥远破旧的小村庄,男女成婚仍是以古老的、传统的模式:相亲,合时辰八字,合得来则订婚,择日
成亲。其中最忽悠的则是合时辰八字,话说是月老决定,实则是根据某条公式,算是否合得来。通过多年
的明察暗访,终于让我知道合地辰八字的公式了。其规则如下:
1、 根据某条公式将时辰八字转化成一个整数num, 为了方便起见,以后就用这个num表示该人的时辰八字。
2、 如果男女双方的时辰八字之和等于一个给定的数sum,则称此对时辰八字合得来。否则相反。
3、 如果时辰八字合不来的人结婚,会被抓去浸猪笼的,因为会被当成是对神的亵渎。
    如此可知,在咱们村一对男女可以结婚的概率是相当的小。现在你的任务是算出咱们村有多少对男女
可以结婚?




输入格式

第一行输入一个整数T(1<=T<=10),表示样例的个数。
接下来有T个样例,对于每一个样例,第一行输入两个整数n(0<n<10^5),sum(0<sum<=10^8), n 表示
咱们村的人口数,sum 表示给定的和。接下来输入n个人的信息,每个人用两个整数来表示,其中前面一
个表示性别sex(0表示女,1 表示男),后面一个表示其时辰八字num(0<=num<sum,且所有的num
的值各不相同)。为了方便起见,n 个人的信息是按照每个人的num的递增顺序给出的。



输出格式

输出占一行,表示能结婚的男女对数。(注意:没有同性的可以结婚,咱国家不允许)



 

输入样例

1
4 6
0 2 1 3 0 3 1 4



 

输出样例

2



 

提示



 

来源

 王鑫杰 

 

作者

 admin


思路:其中的八字是递增的,很容易想到要用二分!但是一定一定要注意的是,必须要用scanf,不然用cin会wa无数次!!

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define man 1
#define woman 0
#define unmarry 0
#define marry 1
#define maxn 100005
using namespace std;
int female[maxn],male[maxn],female2[maxn];
int searchp(int left,int right,int need)
{
        int i,j,mid;
        while(left<=right)
        {
                mid=(left+right)/2;
                if(female[mid]==need&&female2[mid]==unmarry)
                        {
                                return mid;
                                female2[mid]=marry;
                        }
                else if(female[mid]>need)
                        right=mid-1;
                else if(female[mid]<need)
                        left=mid+1;
                else if(female[mid]==need&&female2[mid]==marry)
                        return 0;
        }
        return 0;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(female2,unmarry,sizeof(female2));
        int i,n,sum,couple=0,malenum=0,femalenum=0,sex,num;
        scanf("%d%d",&n,&sum);
         for(i=1;i<=n;i++)
         {
                scanf("%d%d",&sex,&num);
                if(sex==man)
                        male[++malenum]=num;
                else if(sex==woman)
                        female[++femalenum]=num;
         }

         for(i=1;i<=malenum;i++)
         {
                int need=sum-male[i],flag=searchp(1,femalenum,need);
                if(flag)
                {
                        couple++;
                }
         }
         printf("%d\n",couple);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值