📦 EdwonLim / edwonlim.github.io

📄 2013-12-24-每周ACM之一:最强Dota阵容.markdown · 116 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116---
layout: post
title: "每周ACM之一:最强Dota阵容"
date: 2013-12-24 12:00:00
category: acm
summary: "每周ACM,第一期,最强Dota阵容。"
---

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

{% highlight text %}
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
{% endhighlight %}

### Sample Output

{% highlight text %}
2 3 4 5 6
{% endhighlight %}

**【答案如下】**

只是一道非常简单的题,直接枚举即可。

{% highlight c++ %}
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

struct node
{
    int id;
    double li, zhi, min;
} hero[20];

int cmp(node x, node y) {
    return x.id < y.id;
}

int main() {
    int t, i, x1, x2, x3, x4, x5;
    double li, min, zhi, minn, ping, s;
    int f1, f2, f3, f4, f5;
    scanf("%d", &t);
    while (t--) {
        minn = 10000000;
        int n;
        scanf("%d", &n);
        for(i = 0; i < n; i ++) {
            scanf("%d%lf%lf%lf", &hero[i].id, &hero[i].li, &hero[i].min, &hero[i].zhi);
        }
        sort(hero, hero + n, cmp);
        for(x1 = 0; x1 < n - 4; x1 ++) {
            for(x2 = x1 + 1; x2 < n - 3; x2 ++) {
                for(x3 = x2 + 1; x3 < n-2; x3 ++) {
                    for(x4 = x3 + 1; x4 < n-1; x4 ++) {
                        for(x5 = x4 + 1; x5 < n; x5 ++) {
                            li = (hero[x1].li + hero[x2].li + hero[x3].li + hero[x4].li + hero[x5].li) / 5;
                            min = (hero[x1].min + hero[x2].min + hero[x3].min + hero[x4].min + hero[x5].min) / 5;
                            zhi = (hero[x1].zhi + hero[x2].zhi + hero[x3].zhi + hero[x4].zhi + hero[x5].zhi) / 5;
                            ping = (li + min + zhi) / 3;
                            s = ((li - ping) * (li - ping) + (min - ping) * (min - ping) + (zhi - ping) * (zhi - ping)) / 3;
                            if (s < minn) {
                                f1 = hero[x1].id;
                                f2 = hero[x2].id;
                                f3 = hero[x3].id;
                                f4 = hero[x4].id;
                                f5 = hero[x5].id;
                                minn = s;
                            }
                        }
                    }
                }
            }
        }
        printf("%d %d %d %d %d\n", f1, f2, f3, f4, f5);
    }

    return 0;
}

{% endhighlight %}