那时还是复习阶段,过一天就要考IT项目管理,KJ说有个srm,毕竟是2011年的最后一场srm。
就抽出了一点时间做了250pt,和500pt。
250pt,关于回文窜的。一个大水题,直接比较判断一下就行了。
500pt,最后系统测试挂了,原来是被10整除的数没有排序
比如这个样例
10 10 50 10 10 5
1000pt 报告说的候选的时间点就是两个蚊子相碰的时间点,具体没有给出证明。
所以我们只要枚举出每两个蚊子碰撞的时间点就行了,还要判断一下开始的时间,
也就是说t=0的时刻。
由于时间是整数,我们稍微转化一下,避免精度问题。
t=tx/tv
(xInit[j]+v[j]*t)-(xInit[i]+v[i]*t)<=2*R (2)
=>(xInit[j]*tv+v[j]*tx)-(xInit[i]*tv+v[i]*tx)<=2*R*tv ((2)式两边乘tv)
注意:我们此时要保证 tv是正数,而且t时间也要保证是非负数。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
int a[100];
int cmp(int x,int y)
{
return x<y;
}
int Findmax(int tx,int tv,vector<int> xInit, vector<int> v,int R)
{
int ls=xInit.size();
// t=tx/tv
// (xInit[j]+v[j]*t)-(xInit[i]+v[i]*t)<=2*R
//=>(xInit[j]*tv+v[j]*tx)-(xInit[i]*tv+v[i]*tx)<=2*R*tv
for(int i=0;i<ls;i++)
a[i]=xInit[i]*tv+v[i]*tx;
int m=2*R*tv;
sort(a,a+ls,cmp);
int mbest=0;
int sum=0;
for(int i=0;i<ls;i++)
{
sum=0;
for(int j=i;j<ls;j++)
{
if(a[j]-a[i]<=m)
sum+=1;
}
if(sum>=mbest)
mbest=sum;
}
return mbest;
}
class Mosquitoes
{
public:
int getMaximum(vector<int> xInit, vector<int> v, int R)
{
int ls=xInit.size();
int maxs=Findmax(0,1,xInit,v,R);
for(int i=0;i<ls;i++)
{
for(int j=i+1;j<ls;j++)
{
int tx=xInit[i]-xInit[j];
int tv=v[j]-v[i];
if(tv==0 || tx*tv<0)
continue;
if(tv<0)
{
tv=-tv;
tx=-tx;
}
int temp=Findmax(tx,tv,xInit,v,R);
if(temp>maxs)
maxs=temp;
}
}
return maxs;
}
};