• SCAU 8628 相亲


    8628 相亲

    时间限制:500MS  内存限制:1000K

    题型: 编程题   语言: 无限制

    Description

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

    Input

    第一行输入一个整数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的递增顺序给出的。
    

    Output

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

    Sample Input

    1
    4 6
    0 2 1 3 0 3 1 4
    

    Sample Output

    2

    Source

    王鑫杰

    Provider

    admin

    #include<stdio.h>
    #include<string.h>
    int female[100020];
    int male[100020];
    int strm, strw, sumn;
    int solve()
    {
        //说实话,题目不太严谨,已说明num各不相同,但Sample里已有相同的num(至少也要说明前提是sex一样)
        //因为是已排序输入,min(female[])和max(male[])相加后进行比较,完全可以先排除>sumn的male[],后面的
        //female[]>此刻的female[],无进行比较的意义
        int i, res = 0;
        --strm;
        if(strm<0) return res;
        for(i=0; i<strw; ++i)
        {
            while(female[i]+male[strm] >= sumn)
            {
                if(female[i]+male[strm] == sumn) res++;
                --strm;
                if(strm<0) return res;
            }
        }
        return res;
    }
    
    
    
    int main()
    {
        int i, T, n, sex, num;
        scanf("%d", &T);
        while(T--)
        {
            strm = strw = 0;
            scanf("%d%d", &n, &sumn);
            memset(female, 0, sizeof(female));
            memset(male, 0, sizeof(male));
            for(i=1; i<=n; ++i)
            {
                scanf("%d%d", &sex, &num);
                if(sex) male[strm++] = num;
                else  female[strw++] = num;
            }
        
            printf("%d\n", solve());
        }
        return 0;
    }


     

    解题报告:

    这题WA了3次,最后还是得寻求师兄的帮助,WA的原因是根据我的思路做题时,数组需要开得很大10^8次方,而OJ却是不允许的,其中问了师兄这样的一个问题:

     做一道题,有了思路,然后测试数据也过了,但提交WA了,这时思维会感到很乱,(相比之前我已经有所进步了,现在会写数据测试)再次查看题目的时候,还是会按照以前的想法去思考问题,尽管尽力的避免,但最后还是忽略了你WA的原因(而这原因却还是出现在题目上的),这个问题如何解决?

    WA Code
    #include<stdio.h>
    #include<string.h>
    int sum[100000020];
    int male[100020];
    int main()
    {
        int i, j, T, n, sumn, sex, num, count, result;
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d%d", &n, &sumn);
            memset(sum, 0, sizeof(sum));
            memset(male, 0, sizeof(male));
            for(i=1,count=0; i<=n; ++i)
            {
                scanf("%d%d", &sex, &num);
                if(sex) male[count++] = sumn - num;
                else  sum[num]++;
            }
            for(i=0,result=0; i<count; ++i)
            if (sum[male[i]] > 0) 
            {
               ++result;
               --sum[male[i]];
            }
            printf("%d\n", result); 
        }
        return 0;
    }

    师兄的回答是:这个有很多的经验和知识的积累才能够掌握的。 步轻云 18:04:47 不是一两个月就能培养好的能力

    这个问题最直接的原因还是赤裸裸的体现在少做题的问题上,所以,无他,尽力培养自己的思维能力。

  • 相关阅读:
    C#中如何禁止WindowsMediaPlayer双击全屏显示
    .NET中的泛型概述
    c# Windows服务管理
    C:Program不是内部或外部命令,也不是可运行的程序或批处理文件。
    Wireshark教程之二:Wireshark捕获数据分析
    Wireshark教程之一:认识Wireshark界面
    利用windows服务实现整点报时功能
    在windows服务中使用定时器
    flickity:支持触摸滑动,响应迅速的幻灯片轮播插件
    无法定位 Local Database Runtime 安装。请验证 SQL Server Express 是否正确安装以及本地数据库运行时功能是否已启用。
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/2775542.html
Copyright © 2020-2023  润新知