题目链接:点击打开链接
题意一个半径为r的求以大小为v,初速度方向为a在l*w的矩阵中运动,碰撞后无能量损耗,问s秒后球所在位置。
令x-r,y-r,l-2*r,w-2*r,然后矢量分解,x方向总距离sumx = x + v*s*cos(a*180/pi), sumy = y + v*s*sin(a*180/pi),就等价于从(0,0)出发,然后就可以直接计算最终位置了,
注意因为0<=a<360,x<0时直接取正就行,因为从0,0出发往负方向运动会直接反弹。
#include <bits/stdc++.h> #include <ext/hash_map> #include <ext/hash_set> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/priority_queue.hpp> using namespace std; using namespace __gnu_cxx; using namespace __gnu_pbds; #define XINF INT_MAX #define INF 0x3F3F3F3F #define MP(X,Y) make_pair(X,Y) #define PB(X) push_back(X) #define REP(X,N) for(int X=0;X<N;X++) #define REP2(X,L,R) for(int X=L;X<=R;X++) #define DEP(X,R,L) for(int X=R;X>=L;X--) #define CLR(A,X) memset(A,X,sizeof(A)) #define IT iterator #define RIT reverse_iterator typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PII; typedef vector<PII> VII; typedef vector<int> VI; typedef tree<PII, null_type, greater<PII>, rb_tree_tag, tree_order_statistics_node_update > rb_tree_set; typedef tree<PII, PII, greater<PII>, rb_tree_tag, tree_order_statistics_node_update > rb_tree; #define PQ std::priority_queue #define HEAP __gnu_pbds::priority_queue #define X first #define Y second #define lson(X) ((X)<<1) #define rson(X) ((X)<<1|1) #define EPS 10e-6 #define pi acos(-1) double judge(double x, double r) { x = fabs(x); int num = (int)x/(2*r); x = x - 2*r*num; if(x > r) x = r - (x-r); return x; } int main() { double l, w, x, y, r, a, v, s; while(cin>>l>>w>>x>>y>>r>>a>>v>>s, l||w||x||y||r||a||v||s) { l -= 2*r; w -= 2*r; x -= r; y -= r; double tx = v*s; x = x + tx*cos(pi/180*a); y = y + tx*sin(pi/180*a); x = judge(x, l); y = judge(y, w); printf("%.2lf %.2lf\n", x+r, y+r); } return 0; }
