CF 231 div2

来源:互联网 发布:mac安装dmg文件失败 编辑:程序博客网 时间:2024/06/18 14:03

A.呵呵

Code:a.cpp


B.Very Beautiful Number

题意:一个数a(p)a(p-1)a...a2a1 * x = a1a(p)a(p-1)...a3a2

思路:小学奥数,枚举个位,依次推出十位,百位,至于为什么是最小解,我当时写的时候还真没考虑

Code:b.cpp


C.Dominoes

题意:给出初始4种牌的个数,求一种摆放方法,使得每列中1的个数的最大值最小

思路:贪心。统计个数,01和10记为同一种,先摆11的,那行没摆完的,暂时先用01把那行补完,然后摆00的,最后摆剩下来的01和10,这个方向要根据前面第一次放01或10的那行的奇偶判断

Code:c.cpp


D.Physical Education and Buns

题意:将一组序列变成等差数列,求对于改变数字的最大改变量的最小值

思路:排序后,枚举生成的等差数列的差,用第一项和差产生一个等差数列,两个序列的差值,就是整个序列可左移右移的范围

用mx和mi记录两个序列差值的最大和最小情况,那么当前所需要的改变量为(mx-mi+1)/2

Code:d.cpp


E.Lightbulb for Minister

题意:给出两个凸包,求第二个凸包平面内的某个点,到第一个凸包上顶点的距离的平方和

思路:假设这个点是 (x,y) ,那么距离的平方和就是一个关于 x,y 的二元二次方程,用 _x2 , _x1 , _x0 分别表示 x^2 , x , 1 的系数,用 _y2 , _y1 , _y0 分别表示 y^2 , y , 1 的系数. 转化成求函数的最值 f(x,y)=_x2*x*x+_x1*x+_x0+_y2*y*y+_y1*y+_y0 。

那么这个函数的最解,应该是 _x = -b/(2a) =-_x1/2/_x2 , _y=-_y1/2/_y2 , 如果这个点在第二个凸包内,那么直接把答案带到函数里。

如果这个点不在凸包内,那么最优解应该在某条边上,那么枚举边上某点 x=q[i].x+k*dx , y=q[i].y+k*dy ,带到函数f(x,y)里面得到

 f(q[i].x+k*dx ,q[i].y+k*dy) = _x2*(x+k*dx)*(x+k*dx) + _x1*(x+k*dx) + _x0 + _y2*(y+k*dy)*(y+k*dy) + _y1*(y+k*dy) + _y0
= (_x2*dx^2+_y2*dy^2)*k^2 + (2*x*dx*_x2+_x1*dx+2*y*dy*_y2+_y1*dy)*k + _x2*x^2+_x1*x+_x0+_y2*y^2+_y1*y+_y0

极值在 _k=-(2*x*dx*_x2+_x1*dx + 2*y*dy*_y2+_y1*dy ) / (2*_x2*dx^2 +2*_y2*dy^2 )  (0<=k<=1) 

_k取得极值后,得到_x,_y ,带到函数 f(x,y) 里,求得最小值

Code:e.cpp




0 0