2018.10.15【JSOI2004】【洛谷P1337】平衡点 / 吊打XXX(向量和)

传送门


解析:

一道和物理结合起来的问题。

思路:

首先假设绳结在原点处,那么绳结会被拉动,向某个方向改变位置。

而这个方向就是合力的方向。

所以一开始我们直接计算出从当前位置受合力方向,这就是我们的移动方向。

而移动多少?采用逼近的方法,初始化一个较大的步长,每次直接向方向移动步长的距离,一旦发现移动方向改变,说明拉过头了,换一个小步长继续(我采用的方法是每次把步长减小 1 / 2 1/2 1/2)。

这样直到逼近到移动的距离小于精度允许范围,就找到近似答案了。


代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const

inline int getint(){
	re int num;
	re char c;;
	re bool f=0;
	while(!isdigit(c=gc()))if(c=='-')f=1;num=c^48;
	while(isdigit(c=gc()))num=(num<<1)+(num<<3)+(c^48);
	return f?-num:num;
}

cs double eps=1e-4;

struct Point{
	double x,y;
	Point(cs double &_x=0,cs double &_y=0):x(_x),y(_y){}
	friend Point operator+(cs Point &a,cs Point &b){return Point(a.x+b.x,a.y+b.y);}
	friend Point operator-(cs Point &a,cs Point &b){return Point(a.x-b.x,a.y-b.y);}
	friend Point operator*(cs Point &a,cs double &b){return Point(a.x*b,a.y*b);}
	friend Point operator/(cs Point &a,cs double &b){return Point(a.x/b,a.y/b);}
	friend double dot(cs Point &a,cs Point &b){return a.x*b.x+a.y*b.y;}
	double norm()cs{return sqrt(dot(*this,*this));}
}p[10004];
int w[10004];

int n;
inline Point move(Point a,double step){
	Point q=Point(0,0);
	for(int re i=1;i<=n;++i){
		double tmp=(a-p[i]).norm();
		if(tmp==0)continue;
		q=q+(p[i]-a)*w[i]/tmp;
	}
	return a+(q/q.norm()*step);
}

signed main(){
	n=getint();
	for(int re i=1;i<=n;++i){
		p[i].x=getint();
		p[i].y=getint();
		w[i]=getint();
	}
	double step=8000;
	Point p=Point(0,0);
	bool mx=1,my=1;
	while(true){
		Point q=move(p,step);
		if(fabs(q.x-p.x)<eps&&fabs(q.y-p.y)<eps)break;
		if(mx!=(q.x>p.x)||my!=(q.y>p.y)){
			mx=!q.x>p.x;
			my=!q.y>p.y;
			step*=0.5;
		}
		p=q;
	}
	printf("%.3f %.3f",p.x,p.y);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值