bnu10791DOTA选人

DOTA选人

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Type: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •                   
  • DOTA(Defense of the Ancients)是一款很受欢迎的游戏。DOTA将10个游戏玩家分为两组,分别为天灾和近卫,推倒对方主基地的一方获得胜利。每个玩家可以选择一个英雄作为游戏中的角色。每个角色有三个属性:力量,敏捷,智力。选人的策略对比赛的胜负非常关键,现在需要你找出最平衡的一套阵容(5个英雄)。这里对平衡性F做个很简单的定义:设E1是一套阵容力量的平均数,E2是敏捷的平均数,E3是智力的平均数,F是E1,E2,E3的方差, F越小越平衡。

    Input

    第一行一个正整数 C  表示一共有多少组数据
    对于每一组数据:
    第一行一个正整数N,表示这组英雄的个数(5<=N<=20)
    接下来的N行每行有4个整数 B,L,M,Z 表示该英雄编号为B,力量为L,敏捷为M,智力为Z。(1<=B<=N  0<L,M,Z<1000)

    Output

    对于每组数据,输出一行为最平衡的一套阵容(5个英雄的编号),英雄的编号需要从小到大排列,如果存在多组解输出英雄编号字典序最小的。

    Sample Input

    1
    6
    3 1 1 1
    2 1 1 1
    1 7 8 9
    4 1 1 1
    5 1 1 1
    6 1 1 1
    

    Sample Output

    2 3 4 5 6


    Source


    //我们的目的是计算出每所有人的方差,然后排序输出,过程直接暴搜O(20^5)
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct node
    {
        int id;
        double l,m,z;
    }hero[25];
    int cmp(node a,node b)
    {
        return a.id<b.id;
    }
    int main()
    {
        int t,n;
        double l,m,z,aver,fc,minm;
        int r1,r2,r3,r4,r5;
        int id1,id2,id3,id4,id5;
        scanf("%d",&t);
        while(t--)
        {
            minm=1000000;
            scanf("%d",&n);
            for(int i=0;i<n;i++)
            {
                scanf("%d%lf%lf%lf",&hero[i].id,&hero[i].l,&hero[i].m,&hero[i].z);
            }
            sort(hero,hero+n,cmp);
            for(r1=0;r1<n-4;r1++)
              for(r2=r1+1;r2<n-3;r2++)
                for(r3=r2+1;r3<n-2;r3++)
                  for(r4=r3+1;r4<n-1;r4++)
                    for(r5=r4+1;r5<n;r5++)
                    {
                        l=(hero[r1].l+hero[r2].l+hero[r3].l+hero[r4].l+hero[r5].l)/5;
                        m=(hero[r1].m+hero[r2].m+hero[r3].m+hero[r4].m+hero[r5].m)/5;
                        z=(hero[r1].z+hero[r2].z+hero[r3].z+hero[r4].z+hero[r5].z)/5;
                        aver=(l+m+z)/3;
                        fc=(l-aver)*(l-aver)+(m-aver)*(m-aver)+(z-aver)*(z-aver);
                        if(fc<minm)
                        {
                            id1=hero[r1].id;
                            id2=hero[r2].id;
                            id3=hero[r3].id;
                            id4=hero[r4].id;
                            id5=hero[r5].id;
                            minm=fc;
                        }
                    }
            printf("%d %d %d %d %d\n",id1,id2,id3,id4,id5);
        }
        return 0;
    }
    


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值