Cakey McCakeFace(练习函数)

题目:Cakey McCakeFace

题目链接:http://exam.upc.edu.cn/problem.php?id=5165

题意:有N个时间点,有M个时间点,但是有部分时间点是不对的,

要你找出    出现过最多次数的一个时间段,要是次数相同就输出最小的那一个。

这题一看这么多人内存超限就知道是用了Map来存记录的次数,但是Map里面是一个红黑树,要是刚好出现一个差值是1e9,肯定会超限。

其实这题很水。但是这题可以用到了一些小技巧,因为我不熟我在那调BUG调了很久,要不然早过了。。。(事后诸葛亮)

三个小技巧:

1、memset(要复制的数组,被复制的数组,数组的前几个元素×sizeof(类型))

2、unique(要除重的数组,数组的大小-(a+cnt))---返回的是数组的末尾。

要是减去首地址就会得到这个数组的大小(除重后的)。

vector        a.erase(    unique(    a.begin()    ,   a.end()    )  ,     a.end()    );

3、要知道在一个升序的数组中,要知道K的个数,

num=upper_bound(a,a+cnt,k)-lower_bound(a,a+cnt,k);

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int a[2005],b[2005],c[n*m+10],d[n*m+10];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }for(int i=0;i<n;i++){
        scanf("%d",&b[i]);
    }
    int cnt=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(b[j]-a[i]>=0){
                c[cnt++]=b[j]-a[i];
            }
            /*else{
                break;
            }*/
        }
    }
    memcpy(d,c,cnt*sizeof(int));
    int tot=cnt;
    cnt=unique(d,d+cnt)-d;
    /*for(int i=0;i<cnt;i++){
        printf("%d%c",d[i],i==cnt-1?'\n':' ');
    }*/

    sort(d,d+cnt);
    sort(c,c+tot);
    //printf("%d\n",cnt);

    int ans=d[0],ans_num=upper_bound(c,c+tot,d[0])-lower_bound(c,c+tot,d[0]);
    for(int i=0;i<cnt;i++){
        int t=upper_bound(c,c+tot,d[i])-lower_bound(c,c+tot,d[i]);
        if(t>ans_num){
            ans=d[i];
            ans_num=t;
        }
    }
    return 0*printf("%d\n",ans);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值