您的位置:首页 > 其它

暴力____Football(2016swust校赛)

2016-06-06 04:19 127 查看
SWUST杯第X届足球比赛正在激烈进行中,现在是小组赛阶段,下面是小组赛的规则: 

一场比赛中进球较多的队伍赢得这场比赛

赢的队伍得3分,平局两队各得1分,输的队伍0分

一个小组有4只队,6场比赛,每只队分别与其他队比赛一次

每个小组排位第一和第二的队伍从小组中晋级

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

小组中总净胜球高者排位靠前,总净胜球=总进球数-总失球数

小组中总进球数高者排名靠前

队伍名字典序较小者排名靠前

  

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 <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <algorithm>
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  暴力