P2625 豪华游轮 (背包$dp$,数学)

题目链接


Solution

贼有意思的一个题目。
可以发现阻止我们走的更远的就是那些需要反向走的路程。
然后发现当角度越接近 (180^circ) ,对我们最终的答案则更优。
所以先是一个背包把可以达到的角度处理一下,然后再直接算就好了。
卡精度。

Code

#include<bits/stdc++.h>
#define pi 3.141592653589
using namespace std;
int p[1001];
int n,cnt,tot;
int v[400],h[400];
double ans=1000,sum,sup;

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		string s; cin>>s;
		int ww; cin>>ww;
		if(s[0]=='f') sum+=ww;
		if(s[0]=='b') sup+=ww;
		if(s[0]=='l') p[++cnt]=-ww;
		if(s[0]=='r') p[++cnt]=ww;
	}
	v[0]=1;
	for(int i=1;i<=cnt;i++)
	for(int j=0;j<360;j++)
	{
		if(v[j])
		h[(j+p[i]+3600)%360]=1;
		v[j]=h[j];
	}
	for(int i=0;i<360;i++)
	if(!v[i]) continue;
	else 
	if(abs(i-180)<ans)
	ans=abs(i-180);
	
	ans=(ans/(180*1.0000))*pi;
	
	double kk=cos(ans);
	double cc=sin(ans); 
	double hen=sup*cc;
	double shu=sup*kk+sum;
	double Ans=sqrt(pow(hen,2)+pow(shu,2));
	
	printf("%.6lf
",Ans);
	return 0;
}
原文地址:https://www.cnblogs.com/Kv-Stalin/p/9811716.html