Problem A. Balanced Fighters
Posted studyshare777
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Problem A. Balanced Fighters相关的知识,希望对你有一定的参考价值。
https://codeforces.com/group/5yyKg9gx7m/contest/273522/problem/B
题目描述:
每2个fighter之间打。问A打赢B,B打赢C,C打赢A的组合有多少个。(输出顺序任意,但每组只能输出一次)
分析:
这样就变成求有向图的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 ",x,y); int dx=max(0,A[x]-D[y]),dy=max(0,A[y]-D[x]); //printf("%d a %d ",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 ",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 ",ans); if(!as.empty()) for(int i=0;i<ans;i++) { printf("%s %s %s ",s[as[i].o],s[as[i].p],s[as[i].q]); } return 0; }
以上是关于Problem A. Balanced Fighters的主要内容,如果未能解决你的问题,请参考以下文章
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary
Codeforces - 102222H - Fight Against Monsters - 贪心
uva live 7637 Balanced String (贪心)
HDU - 3709 - Balanced Number(数位DP)