Problem A. Balanced Fighters

Problem A. Balanced Fighters

https://codeforces.com/group/5yyKg9gx7m/contest/273522/problem/B

题目描述:

每2个fighter之间打。问A打赢B,B打赢C,C打赢A的组合有多少个。(输出顺序任意,但每组只能输出一次)

分析:

按他的规则,用一个combat函数判断一个fighter能否打赢另一个。可以以他们能撑住的最大回合数为标准。遍历每一组对手,用win[i] [j]记录,1表示i打赢j。

这样就变成求有向图的3元环。

因为N只有100,比较小。A->B->C->A,可以用i表示A和j表示C,其中i<j。k表示B,k可以取任意。这样就相当于固定了i和j的一种组合,暴力找符合的k。同样,反过来A<-B<-C<-A就相当于把i和j互换。

最后用used[a] [b] [c]来记录是否已经存入答案,已经存入就之直接跳过。用used记录3元组是否已使用最好是按一定顺序存。(比如a<b<c)

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<deque>
#include<cmath>
#include<map>
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
using namespace std;
typedef long long ll;
const int INF=7e8;
struct node
{
    int o,p,q;
}v;
char s[106][20];
int H[106],A[106],D[106];
bool win[106][106];
int a[3];
bool used[106][106][106];
bool combat(int x,int y)
{
    //printf("%d vs %d\n",x,y);
    int dx=max(0,A[x]-D[y]),dy=max(0,A[y]-D[x]);
    //printf("%d a %d\n",dx,dy);
    int rx,ry;
    if(dy==0) rx=INF;
    else rx=H[x]%dy==0?H[x]/dy:H[x]/dy+1;
    if(dx==0) ry=INF;
    else ry=H[y]%dx==0?H[y]/dx:H[y]/dx+1;
    //printf("%d rod %d\n",rx,ry);
    if(rx>ry) return 1;//x赢 
    else return 0;
}
bool watch(int i,int j,int k)
{
    a[0]=i,a[1]=j,a[2]=k;
    sort(a,a+3);
    if(used[a[0]][a[1]][a[2]]) return 1;
    else return 0;
}
int main()
{
    int n,k;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%s%d%d%d",s[i],&H[i],&A[i],&D[i]);
    }
    memset(win,0,sizeof 0);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j) continue;
            if(combat(i,j)) win[i][j]=1;
        }
    }
    int ans=0;
    vector<node> as;
    as.clear();
    memset(used,0,sizeof used);
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {        
            for(int k=1;k<=n;k++)
            {
                if(watch(i,j,k)) continue;
                if(win[i][k]&&win[k][j]&&win[j][i])
                v.o=i,v.p=j,v.q=k,ans++,as.push_back(v),used[a[0]][a[1]][a[2]]=1;
                else if(win[j][k]&&win[k][i]&&win[i][j])
                v.o=j,v.p=i,v.q=k,ans++,as.push_back(v),used[a[0]][a[1]][a[2]]=1;
            }
        }
    }
    printf("%d\n",ans);
    if(!as.empty())
    for(int i=0;i<ans;i++)
    {
        printf("%s %s %s\n",s[as[i].o],s[as[i].p],s[as[i].q]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/studyshare777/p/12574575.html