[UVALive](7908)World Cup ---- 枚舉子集(暴力)

題目傳送門

做法: 模擬賽時6重循環暴力過了,但是聽了聽超霸的三進制枚舉子集,感覺有些意思,就寫了寫,複雜度相同。其中中間代碼比較糙,沒有優化,無腦寫的。

AC代碼:

#include<bits/stdc++.h>
using namespace std;

#define IO          ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pb(x)       push_back(x)
#define sz(x)       (int)(x).size()
#define sc(x)       scanf("%d",&x)
#define abs(x)      ((x)<0 ? -(x) : x)
#define all(x)      x.begin(),x.end()
#define mk(x,y)     make_pair(x,y)
#define fin         freopen("in.txt","r",stdin)
#define fout        freopen("out.txt","w",stdout)

typedef long long ll;
typedef pair<int,int> PII;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxm = 5e6+5;
const int maxn = 1e5+5;
const int INF = 0x3f3f3f3f;
const ll LINF = 1ll<<62;

int ans[maxn];
int res[20][20][20][20];
int so[4];
void cal(int x)
{
    int k = 0;
    while(x)
    {
        ans[k++] = x%3;
        x/=3; 
    }
}
void solve()
{
    for(int s = 0;s<729;s++)
    {
        cal(s);
        memset(so,0,sizeof(so)); //0-A 1-B 2-C 3-D
        for(int i=0;i<6;i++)//i:0-->AB  1-->AC  2-->AD  3-->BC  4-->BD 5-->CD 
        {
            if(i == 0){
                if(ans[i] == 2) so[0]+=3;
                if(ans[i] == 1) so[0]++,so[1]++;
                if(ans[i] == 0) so[1]+=3; 
            }
            if(i == 1){
                if(ans[i] == 2) so[0]+=3;
                if(ans[i] == 1) so[0]++,so[2]++;
                if(ans[i] == 0) so[2]+=3; 
            }
            if(i == 2){
                if(ans[i] == 2) so[0]+=3;
                if(ans[i] == 1) so[0]++,so[3]++;
                if(ans[i] == 0) so[3]+=3; 
            }
            if(i == 3){
                if(ans[i] == 2) so[1]+=3;
                if(ans[i] == 1) so[1]++,so[2]++;
                if(ans[i] == 0) so[2]+=3; 
            }
            if(i == 4){
                if(ans[i] == 2) so[1]+=3;
                if(ans[i] == 1) so[1]++,so[3]++;
                if(ans[i] == 0) so[3]+=3; 
            }
            if(i == 5){
                if(ans[i] == 2) so[2]+=3;
                if(ans[i] == 1) so[2]++,so[3]++;
                if(ans[i] == 0) so[3]+=3; 
            }
        }
        //cout<<so[0]<<" "<<so[1]<<" "<<so[2]<<" "<<so[3]<<endl;
        res[so[0]][so[1]][so[2]][so[3]]++;
    }
}
int main()
{
    // fin;
    IO;
    solve();
    int t,idx = 1;
    cin>>t;
    while(t--)
    {
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        if(a>9 || b>9 || c>9 || d>9){
            cout<<"Case #"<<idx++<<": "<<"Wrong Scoreboard"<<endl;
            continue;
        }
        if(res[a][b][c][d]>1) cout<<"Case #"<<idx++<<": "<<"No"<<endl;
        else if(res[a][b][c][d] == 1)cout<<"Case #"<<idx++<<": "<<"Yes"<<endl;
        else cout<<"Case #"<<idx++<<": "<<"Wrong Scoreboard"<<endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章