URAL 1397 Points Game <博弈>

来源:互联网 发布:编程器刷主板bios 编辑:程序博客网 时间:2024/06/06 03:14

题目:http://acm.timus.ru/problem.aspx?space=1&num=1397

题意 :给出平面2n点,有两个玩家游戏。每个回合,玩家A可以取走一个点,然后玩家B取走一个。经过n个回合没有点了,结束比赛。一个玩家的得分是他所取走的所有两两之间的欧几里得距离的和,得分最高者获胜。AB都是聪明人,求两者分数之差为多少

分析 :寻找点集之间的关系,博弈


#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;struct Point{    double x,y;}p[1005];//double dist[1005][1005];double dis[1005];double diss(Point a,Point b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}int main(){     int n;     double sumij;     //double px,py;     while(cin >> n)     {         sumij = 0;//sum = 0;         //memset(dist,0,sizeof(dist));         memset(dis,0,sizeof(dis));         for(int i=1;i<=2*n;i++)         {             scanf("%lf %lf",&p[i].x,&p[i].y);         }         for(int i=1;i<=2*n;i++)            for(int j=i+1;j<=2*n;j++)                sumij += diss(p[i],p[j]);         for(int i=1;i<=2*n;i++)         {             for(int j = 1;j<=2*n;j++)             {                 if(i==j) continue;                 dis[i-1] += diss(p[i],p[j]);                // printf("i = %d j = %d dist = %.3f\n",i,j,diss(p[i],p[j]));             }             //printf("%.3f\n",dis[i-1]);         }         //printf("sumij = %.3f\n",sumij);         sort(dis,dis+2*n);         for(int i=2*n-2;i>=0;i-=2)            sumij -= dis[i];         printf("%.3f\n",sumij);     }     return 0;}


0 0
原创粉丝点击