1. 程式人生 > >Gym 101194L / UVALive 7908 - World Cup - [三進制狀壓暴力枚舉][2016 EC-Final Problem L]

Gym 101194L / UVALive 7908 - World Cup - [三進制狀壓暴力枚舉][2016 EC-Final Problem L]

printf attach pre uvalive set 結果 題意 fin max

題目鏈接:

http://codeforces.com/gym/101194/attachments

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5930

題意:

現有四支隊伍兩兩打比賽,總共就是打六場比賽,每場比賽贏的隊伍可得 $3$ 分,輸的隊伍得 $0$ 分,平局則兩個隊各得 $1$ 分。

現在給出四個隊伍最終的積分,問能否確切給出每場比賽的結果。

題解:

顯然,六場比賽,每場有三種結果,三進制數 $[0,3^6)$ 暴力枚舉所有可能的六場比賽結果即可。

AC代碼:

#include<bits/stdc++.h>
using namespace std;
const int MAX=(int)pow(3,6);
const int t1[6]={1,1,1,2,2,3};
const int t2[6]={2,3,4,3,4,4};
int a,b,c,d;
int score[MAX][5];
inline bool Same(int s) {
    return score[s][1]==a&&score[s][2]==b&&score[s][3]==c&&score[s][4
]==d; } void Solve() { memset(score,0,sizeof(score)); for(int sta=0;sta<MAX;sta++) { for(int i=0,s=sta;i<6;i++,s/=3) { int res=s%3; switch(res) { case 0: score[sta][t1[i]]+=3; break;
case 1: score[sta][t2[i]]+=3; break; case 2: score[sta][t1[i]]++; score[sta][t2[i]]++; break; } } } int tot=0; for(int sta=0;sta<MAX;sta++) if(Same(sta)) tot++; if(!tot) printf("Wrong Scoreboard\n"); else if(tot==1) printf("Yes\n"); else printf("No\n"); } int main() { int T; cin>>T; for(int kase=1;kase<=T;kase++) { cin>>a>>b>>c>>d; printf("Case #%d: ",kase); Solve(); } }

Gym 101194L / UVALive 7908 - World Cup - [三進制狀壓暴力枚舉][2016 EC-Final Problem L]