那時還是複習階段,過一天就要考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;
}
};