B:01 篮球联赛

总时间限制: 

1000ms

内存限制: 

65536kB

描述

校篮球队每年都会举办“年级联赛”。篮球队的队员们将根据年级分为一年级、二年级、三年级和四年级4支队伍,参与角逐。

在年级联赛中,不同队伍两两之间比赛一场,胜者积1分,负者积0分(篮球比赛无平局)。最终队伍将按照积分从高到低排名,若出现同分,则年级较低的排名靠前。

现在年级联赛正在进行中,有些比赛已经结束,有些比赛则因种种原因还未进行。请你根据当前的比赛情况,计算出一年级队在联赛结束后,有可能得到的最高名次。

输入

输入包含多组数据。第一行是一个整数T(1 <= T <= 100),表示数据组数。

对于每组数据,用一个4*4的字符矩阵表示当前的比赛情况。第i行第j列表示i年级与j年级的比赛情况,其中:
“-”表示i与j相同,无比赛
“W”表示i年级胜j年级
“L”表示i年级负j年级
“?”表示i年级和j年级的比赛还未进行

输入数据保证正确不存在矛盾,且无多余空格或空行。

输出

对于每组数据,输出一个整数,即一年级队在联赛结束后,有可能获得的最高名次。

样例输入

2
-LL?
W-L?
WW-L
??W-
-WL?
L-?L
W?-L
?WW-

样例输出 

3
1

就是说,二进制模拟一下剩下的比赛状态

再枚举

#include<iostream>
#include<cstring>
using namespace std;

char match[4][4];
int points[4]={};
int undone[4][3]={};

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        memset(match,' ',sizeof(match));
        memset(points,0,sizeof(points));
        memset(undone,0,sizeof(undone));
        int cnt=0;
        for(int i=0;i<4;i++)
            for(int j=0;j<4;j++)
                {
                    cin>>match[i][j];
                    if(j>i)
                    {
                    if(match[i][j]=='W')
                    points[i]++;
                    else if(match[i][j]=='L')
                    points[j]++;
                    else if(match[i][j]=='?')
                    {
                        if(i==0)
                        points[i]++;
                        else
                        {
                            undone[cnt][0]=i;
                            undone[cnt][1]=j;
                            undone[cnt][2]=0;//储存剩下的比赛场数
                            cnt++;
                        }
                    }
                    }
                }
            int ans=4;
            int points_[4]={};
            /*笨拙的模拟二进制
            for(int i=0;i<=1<<(cnt);i++)
            {
                int pos=0;
                undone[0][2]++;
                for(int j=0;j<4;j++)
                points_[j]=points[j];
                while(undone[pos][2]>1)
                {
                    undone[pos][2]=0;
                    pos++;
                    undone[pos][2]++;
                }
                for(int j=0;j<cnt;j++)
                {
                    if(undone[j][2]==1)
                        points_[undone[j][0]]++;
                    else
                        points_[undone[j][1]]++;
                }
                int _ans=1;
                for(int j=1;j<4;j++)
                    if(points_[j]>points_[0])
                    _ans++;
                ans=min(_ans,ans);
            }*/
            for(int i=0;i<=1<<(cnt);i++)//二进制储存状态
            {
                memcpy(points_,points,sizeof(points));
                for(int j=0;j<cnt;j++)
                {
                    if((i>>j)&1)
                    points_[undone[j][0]]++;
                    else
                    points_[undone[j][1]]++;
                }
                int _ans=1;
                for(int j=1;j<4;j++)
                    if(points_[j]>points_[0])
                    _ans++;
                ans=min(_ans,ans);
            }
            cout<<ans<<endl;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值