您的位置:首页 > 其它

srm538 div1

2012-04-06 02:25 417 查看
250pt 水题不写了。

500pt

由于顺序可以随便调整,因此肯定会把向前的合并在一起,向后的合并在一起,然后按照所有可行的角度进行旋转,找出最远距离即可(最接近 180°的就是答案的角度)。

求出所有可行角度DP即可。

在精度问题上卡了好久,mark一下。

class TurtleSpy
{
public:
vector<int> deg;
int da,db;
int getNum(string str,int pos)
{
int tmp = 0;
for(int i = pos;i < str.length();i++)
tmp = tmp * 10 +(str[i]-'0');
return tmp;
}
int absx(int x)
{
return x < 0 ? -x:x;
}
double maxDistance(vector <string> commands)
{
//$CARETPOSITION$
double  pi = acos(-1.0);
deg.clear();
da = db = 0;
for(int i = 0;i < commands.size();i++)
{
switch(commands[i][0] )
{
case 'l':
deg.push_back(getNum(commands[i],5));
break;
case 'r':
deg.push_back(360-getNum(commands[i],6));
break;
case 'f':
da += getNum(commands[i],8);
break;
case 'b':
db += getNum(commands[i],9);
}
}
int minDeg = 360;
bool dp[55][370];
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i = 0;i < deg.size();i++)
for(int j = 359;j >= 0;j--)
if(dp[i][j] == 1)
{
dp[i+1][j] = 1;
dp[i+1][(j+deg[i]) % 360] = 1;
}
for(int i = 0;i < 360;i++)
if(dp[deg.size()][i] == 1 && minDeg > absx(i - 180)) minDeg = absx(i - 180);
minDeg = 180-minDeg;
double ans = sqrt(1.0*da*da+1.0*db*db-cos(1.0*minDeg / 360 *2* pi)*2*da*db);
return ans;
}
};


1050pt 不会做,超出能力范围了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: