写了几篇博客感觉 ...都是代码比较简单的..其实吧,现在数据结构都还不是很熟正在死磕,看到一道几何博弈的题,感觉..有点意思
题目大意是 Alice和boooob(反正我说他叫boooob他就是booob),上天安排的,最大。他们在玩一个游戏,有个三角形,点由你来给出,然后alice找出一个点(她很聪明的那种),然后bob过这个点画出一条线,然后他取最大的那块面积,求如何画这条线他取得的面积才最大?
思路:首先Alice很聪明..她肯定会选出一个利于自己的点,这样bob怎么划线都自己和Alice差值都会最小,那么她会如何选择点呢?想一下,三角形内部特殊的点无非3种,重心,外心,和内心,外心不可能,想一想钝角三角形。内心不可能,比如三角形两条边非常长而第三条边非常短那么内心的话,boob肯定分的特别多...如果他不是个sb的话。
如此一来,假设是重心,那么bob如何去分?如果他是sb那么就按照中线来分了,这是最坏的情况(1,1);那么是否有最优的情况?假设他过重心平行于三角形底边来分,那么上下面积比就会是4:5,还有没有比这更好的分法呢?答案是没有,可以证明:
根据t(AE:AC)和s=2sinA*|AD|*|AE|可以列出s关于t的函数,求导的t=2/3,为唯一极值点,极小值点。(就是DE平行于BC)的时候,这是bob的最优解。
那么alice可以选择其他的点获得的利益更多吗?答案是没有,假设一个点,然后bob取最优解,很明显算出来bob会分得更多。
代码比较简单:
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int x[3],y[3];
scanf("%d %d %d %d %d %d",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2]);
double s=abs((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]))/2.0;
s=s*5/9;
printf("%.1lf\n",s);
return 0;
}