题解:P14584 点击平衡球

· · 题解

题目大意:

给定 n 个机关,你可以任意调换机关的顺序,第 i 个机关有对应的三个状态 c_{i,j} 表示是否允许 j 类型的球通过。

解题思路:

考虑到 n 并不大,所以模拟即可,这边给出一个特别简单的做法,只要枚举出第一次到第三次分别选择什么样的球的类型,然后进行模拟即可。

屎山代码如下:

#include<bits/stdc++.h>
using namespace std;
struct sbb {
    int a,b,c;
    int tp;//个人变量名爱好,勿喷
} sb[105];
int n;
int ans=5;
int main() {
    cin>>n;
    for(int i=1; i<=n; i++)cin>>sb[i].a>>sb[i].b>>sb[i].c;
    int nans=1;//模拟即可,对a,b,c全排列
    for(int i=1; i<=n; i++)sb[i].tp=0;//清空标记(是否有被选择过)
    for(int i=1; i<=n; i++)if(sb[i].a==1)sb[i].tp=1;
    int cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].b==1&&sb[i].tp==0 )nans++,sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].c==1&&sb[i].tp==0 ) {
            nans+=(nans==cc);//只要加第一次,剩下的是打标记
            break;
        }
    ans=min(ans,nans);
    nans=1;
    for(int i=1; i<=n; i++)sb[i].tp=0;
    for(int i=1; i<=n; i++)if(sb[i].a==1)sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].c==1&&sb[i].tp==0 )nans+=(nans==cc),sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].b==1&&sb[i].tp==0 ) {
            nans+=(nans==cc);
            break;
        }
    ans=min(ans,nans);
    nans=1;
    for(int i=1; i<=n; i++)sb[i].tp=0;
    for(int i=1; i<=n; i++)if(sb[i].b==1)sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].a==1&&sb[i].tp==0 )nans+=(nans==cc),sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].c==1&&sb[i].tp==0 ) {
            nans+=(nans==cc);
            break;
        }
    ans=min(ans,nans);
    nans=1;
    for(int i=1; i<=n; i++)sb[i].tp=0;
    for(int i=1; i<=n; i++)if(sb[i].b==1)sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].c==1&&sb[i].tp==0 )nans+=(nans==cc),sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].a==1&&sb[i].tp==0 ) {
            nans+=(nans==cc);
            break;
        }
    ans=min(ans,nans);
    nans=1;
    for(int i=1; i<=n; i++)sb[i].tp=0;
    for(int i=1; i<=n; i++)if(sb[i].c==1)sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].a==1&&sb[i].tp==0 )nans+=(nans==cc),sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].b==1&&sb[i].tp==0 ) {
            nans+=(nans==cc);
            break;
        }
    ans=min(ans,nans);
    nans=1;
    for(int i=1; i<=n; i++)sb[i].tp=0;
    for(int i=1; i<=n; i++)if(sb[i].c==1)sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].b==1&&sb[i].tp==0 )nans+=(nans==cc),sb[i].tp=1;
    cc=nans;
    for(int i=1; i<=n; i++)if(sb[i].a==1&&sb[i].tp==0 ) {
            nans+=(nans==cc);
            break;
        }
    ans=min(ans,nans);
    cout<<ans;
    return 0;
}