暴力____Football(2016swust校赛)


SWUST杯第X届足球比赛正在激烈进行中,现在是小组赛阶段,下面是小组赛的规则: 


  • 一场比赛中进球较多的队伍赢得这场比赛
  • 赢的队伍得3分,平局两队各得1分,输的队伍0分
  • 一个小组有4只队,6场比赛,每只队分别与其他队比赛一次
  • 每个小组排位第一和第二的队伍从小组中晋级

分数越高排位越高,如果两个队有相同的分数,那么按以下规则排序(优先度递减): 

  1. 小组中总净胜球高者排位靠前,总净胜球=总进球数-总失球数
  2. 小组中总进球数高者排名靠前
  3. 队伍名字典序较小者排名靠前

  
BWUST队所在的小组现在6场中的5场结果已经知道了,现在只剩最后一场比赛,这场比赛是BWUST和某支队伍比赛。现在BWUST队的教练想让你找出一个比分X:Y(X表示BWUST队进球数,Y表示BWUST队失球数),满足以下条件: 

  • X>Y,即BWUST赢得比赛
  • 这场比赛结束之后BWUST从小组中晋级
  • 如果有多个比分满足条件,你需要选择X-Y的值最小的比分
  • 如果仍然有多个比分满足条件,你需要选择Y值最小的比分



Description
多组测试数据 
第一行有一个整数T ( T < 60 ),表示有T组测试数据 
接下来每组数据有5行,分别描述5场比赛 
每行描述一个比赛结果 "t1 t2 g1:g2"(不包括引号):其中t1,t2表示队伍名称,用空格隔开;g1,g2分别表示t1的进球数和t2的进球数,用冒号":"隔开。 
队伍名称均由大写字母组成,且长度不超过20个字母。g1,g2是在[0,9]区间的整数。 
BWUST队名字为"BWUST",所有输入数据保证BWUST恰好参加了2场比赛、其他队伍恰好参加了3场比赛,且同一场比赛中没有同名的队伍。 
Input
输出满足条件的比分X:Y。如果无法找出满足第二个条件的比分,则输出"IMPOSSIBLE"(不包括引号) 
X,Y的值无大小限制。 
Output
1
2
3
4
5
6
7
1
AWUST DWUST 2:1
DWUST CWUST 0:3
CWUST AWUST 0:1
AWUST BWUST 2:0
DWUST BWUST 4:0
Sample Input
1
2
6:0
Sample Output

分析:这个题目过程十分繁琐,如果要根据规则然后判断各种情况直接求得结果是十分不易的。不过还好这个题目分数的数据不大,所以我们完全可以暴力枚举答案判断是否可行。


代码:

#include 
#include 
#include 
#include 
#include 
using namespace std;
struct node
{
    string name;
    int a, b;
    int score;
    int num;
}team[4];
 
bool cmp(node x, node y)
{
    if (x.score == y.score)
    {
        if (x.a - x.b == y.a - y.b)
        {
            if (x.a == y.a)
            {
                return x.name < y.name;
            }
            return x.a > y.a;
        }
        return x.a - x.b > y.a - y.b;
    }
    return x.score > y.score;
}
 
string ln[5], rn[5];
int l[5], r[5];
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        for (int i = 0; i < 5; i++)
        {
            cin >> ln[i] >> rn[i];
            scanf("%d:%d", &l[i], &r[i]);
        }
        int len = 0;
        for (int i = 0; i < 5; i++)
        {
            bool flag;
            flag = false;
            for (int j = 0; j < len; j++)
                if (team[j].name == ln[i])
                    flag = true;
            if (!flag)
            {
                team[len].name = ln[i];
                team[len].a = 0;
                team[len].b = 0;
                team[len].score = 0;
                team[len].num = 0;
                len++;
            }
            flag = false;
            for (int j = 0; j < len; j++)
                if (team[j].name == rn[i])
                    flag = true;
            if (!flag)
            {
                team[len].name = rn[i];
                team[len].a = 0;
                team[len].b = 0;
                team[len].score = 0;
                team[len].num = 0;
                len++;
            }
        }
        //printf("len:%d\n", len);
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                int score;
                if (team[j].name == ln[i])
                {
                    if (l[i] > r[i])score = 3;
                    else if (l[i] == r[i]) score = 1;
                    else score = 0;
                    team[j].score += score;
                    team[j].a += l[i];
                    team[j].num++;
                    team[j].b += r[i];
                }
                else if (team[j].name == rn[i])
                {
                    if (r[i] > l[i])score = 3;
                    else if (l[i] == r[i]) score = 1;
                    else score = 0;
                    team[j].score += score;
                    team[j].a += r[i];
                    team[j].num++;
                    team[j].b += l[i];
                }
            }
        }
        bool flag = false;
        for (int of = 1; of < 100; of++)
        {
            for (int y = 0; y < 100; y++)
            {
                // y + of : y
                int i, j;
                for (i = 0; i < 4; i++) if (team[i].name == "BWUST")break;
                for (j = 0; j < 4; j++) if (j != i && team[j].num == 2)break;
 
                team[i].score += 3;
                team[i].a += (y + of);
                team[i].b += y;
 
                team[j].a += y;
                team[j].b += (y + of);
 
                sort(team, team + 4, cmp);
 
                if (team[0].name == "BWUST" || team[1].name == "BWUST")
                {
                    printf("%d:%d\n", y + of, y);
                    flag = true;
                    break;
                }
 
                for (i = 0; i < 4; i++) if (team[i].name == "BWUST")break;
                for (j = 0; j < 4; j++) if (j != i && team[j].num == 2)break;
 
                team[i].score -= 3;
                team[i].a -= (y + of);
                team[i].b -= y;
 
                team[j].a -= y;
                team[j].b -= (y + of);
            }
            if (flag) break;
        }
        if (!flag)
        {
            printf("IMPOSSIBLE\n");
        }
    }
    return 0;
}





你可能感兴趣的:(ACM_日常)