您的位置:首页 > 其它

15 国庆本校脑残题题解

2015-10-07 15:05 183 查看
Hdu 2289 à Cup

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2289

题意: 给你一个杯子(圆台状的),告诉你下底半径、上底半径、高度和里面装的水的体积,然后问你水的高度。

算法:二分

思路:对水的高度进行二分,根据比例求水的体积,与题目给定的体积进行比较。

Hdu 3400 à Line belt

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3400

题意:给你两条线ab和cd,告诉你这四个点的坐标,然后ab上的移动速度为p,cd上的移动速度是q,两条线之外的地方移动速度为r,然后问你从a到d最短时间需要多少?

算法:三分

思路:假设在ab线上移动的距离x,在cd线上的移动距离y,然后时间就等于 x/p + y/q + 两点间距离/r ,做法用三分找x,然后将x和找到的点传递下去三分找y,期间两次都是找极小值。

#include<stdio.h>
#include<conio.h>
#include<math.h>
#define EPS 0.00000001
typedef struct node
{
double x,y;
}Node;
double lab,lcd;
Node funa(Node a,Node b,double x)  // a -> b
{
Node tmp;
if(lab==0)
{
return a;
}
double sab=(b.y-a.y)/lab;
double cab=(b.x-a.x)/lab;
tmp.y=x*sab+a.y;
tmp.x=x*cab+a.x;
return tmp;
}
Node fund(Node c,Node d,double x)  // d -> c
{
Node tmp;
if(lcd==0)
{
return c;
}
double scd=(c.y-d.y)/lcd;
double ccd=(c.x-d.x)/lcd;
tmp.y=d.y+x*scd;
tmp.x=d.x+x*ccd;
return tmp;
}
double funab(Node a,Node b)
{
return sqrt((b.y-a.y)*(b.y-a.y)+(b.x-a.x)*(b.x-a.x));
}
int t,p,q,w;
double solve(Node A,Node B,double i,double j)
{
double ans=funab(A,B)/w;
ans+=i/p;
ans+=j/q;
return ans;
}
Node a,b,c,d;
double fun(Node A,double x,double y)
{
Node B=fund(c,d,y);
return solve(A,B,x,y);
}
double san(Node A,double x,double l,double r)
{
double mid,mmid;
double fm,fmm;
while(l+EPS<r)
{
mid=(l+r)/2;
mmid=(r+mid)/2;
fm=fun(A,x,mid);
fmm=fun(A,x,mmid);
// 以求极小值为例
if(fm>=fmm) l=mid;
else r=mmid;
}
fm=fun(A,x,l);
return fm;
}
double f(double x)
{
Node A=funa(a,b,x);
return san(A,x,0,lcd);
}
double san_f(double l,double r)
{
double mid,mmid;
double fm,fmm;
while(l+EPS<r)
{
mid=(l+r)/2;
mmid=(r+mid)/2;
fm=f(mid);
fmm=f(mmid);
// 以求极小值为例
if(fm>=fmm) l=mid;
else r=mmid;
}
fm=f(l);
return fm;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
scanf("%d%d%d",&p,&q,&w);
lab=funab(a,b);
lcd=funab(c,d);
double mt=san_f(0,lab);
printf("%.2lf\n",mt);
}
return 0;
}


AC代码

下面两道水题,不做无妨。

题目:n ! % ( k ^ i ) == 0

题意:给你n和k,求最大的i 使得 n!% ( k ^ i ) == 0 ; 数据范围非常大

算法:素因子分解

思路:先将k分解,那么可以得到 k = p1 ^ a1 + p2 ^ a2 + p3 ^ a3 + ….. –> 那么k^i里面就有i倍的这些素因子。那么可以算出n!里面这些素因子的个数,然后把这个结果除以k里面相应素因子的个数,找出最小的那个,就是答案。

题目: 略

题意:有一个n*n的棋盘,A站在(1,1),B站在(1,n),然后轮流行动,一次可以上下左右斜着走一步,然后走过的地方不能进入,不能走或被对方踩到自己算输。

算法:博弈论

思路:两人之间隔单数列,那么先走的必输,隔偶数列,先走的人必赢,因为单隔1列的时候,先走的人要么前进一列,然后乖乖受死,要么上升一格,这时,对方可以跟着你的动作,也就是说情况保持不变,当你不能竖着走的时候,你就输了。如果隔两列,那么先走的人可以前进一列,进入第一种情况。隔更多列时类似。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: