题目: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);
}