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;
   }
};


 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值