SRM 528 DIV 2

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


 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章