nyoj 665

题目意思很简单,还记得轻工校赛好像也碰到了类似的题,但是当时没有任何思路,后来看了一眼题解,说要分为纵坐标和横坐标,然后我就写了好多次改了好多次,然后wa了n次,今晚又写了一遍,然后除了马虎,过了!看了题中的讨论,是精度的问题,于是又把原来的代码拉出来,精度一改,过了。。。。

贴两个代码,一个是以前写的需要改精度的,一个是现在写的没有改精度,感觉隔这么多天重新写的感觉就是思路更清晰了

 
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
#include<map>
using namespace std;
#define rep(i,n) for(int i=0; i<n; i++)
#define repf(i,n,m) for(int i=(n); i<=(m); ++i)
#define repd(i,n,m) for(int i=(n); i>=(m); --i)
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define fab(a) ((a)>0?(a):(0-(a)))
#define ll long long
#define arc(a) ((a)*(a))
#define inf 100000
#define exp 0.000001
#define N  
#define pi 3.1415926535
double l,w,x,y,r,a,v,t;
int main()
{ 
	while(cin>>l>>w>>x>>y>>r>>a>>v>>t)
	{
		if(fabs(l-0)<exp && fabs(w-0)<exp)
			break;
		l-=r; w-=r;
         a *= acos(0.0)/90.0;
		double vx,vy;
		vx=cos(a)*v;
		vy=sin(a)*v;
		double ti=t;
		if(fabs(vx-0)>exp)
		{
			double len=(l-r)*2/fabs(vx);
			while(t>=len)
				t-=len;
            len=vx*t;
			x+=len;
			while(x<r || x>l)
			{
				if(x<r)
					x=r+(r-x);
				if(x>l)
					x=l-(x-l);
			}
		}
		if(fabs(vy-0)>exp)
		{
			t=ti;
			double len=(w-r)*2/fabs(vy);
			while(t>=len)
				 t-=len;
			len=vy*t;
			y+=len;
			while(y<r || y>w)
			{
				if(y<r)
					y=r+(r-y);
				if(y>w)
					y=w-(y-w);
			}
		}
		printf("%0.2lf %0.2lf\n",x,y);
	}
   return 0;
}
          

今晚写的:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
#include<map>
using namespace std;
#define rep(i,n) for(int i=0; i<n; i++)
#define repf(i,n,m) for(int i=(n); i<=(m); ++i)
#define repd(i,n,m) for(int i=(n); i>=(m); --i) 
#define ll long long
#define arc(a) ((a)*(a))
#define inf 100000
#define exp 0.000001
#define N  
#define pi 3.141592653589
double l,w,x,y,r,a,v;
double t;
int main()
{ 
	while(cin>>l>>w>>x>>y>>r>>a>>v>>t)
	{
		if(fabs(l-0)<exp && fabs(w-0)<exp)
			break;
		l-=r;
		w-=r;
		a=a/180*pi;
		double tx,ty,vx,vy;
		vx=v*cos(a);
		vy=v*sin(a);
		if(fabs(vx)>exp)
		  tx=2*(l-r)/fabs(vx);
		else
			tx=0;
		if(fabs(vy)>exp)
		    ty=2*(w-r)/fabs(vy);
		else
			ty=0;
        double te=t;
		if(te>tx && tx>exp)
			te-=ceil(te/tx)*tx;
		if(tx>exp)
		tx=te;
		te=t;
		if(te>ty && ty>exp)
			te-=ceil(te/ty)*ty;
		if(ty>exp)
		ty=te;
		x=x+vx*tx;
		y=y+vy*ty;
		while(x<r || x>l)
		{
            if(x<r)  x=r-x+r;
			if(x>l)  x=l-(x-l);
		}
		while(y<r || y>w)
		{
			if(y<r)  y=r-y+r;
			if(y>w)  y=w-(y-w);
		}
		printf("%0.2lf %0.2lf\n",x,y);
	}
   return 0;
}
  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡定的小Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值