[TOJ][406] C. 軍隊部署


題目

老樣子先放連結 [TOJ](<http://toj.tfcis.org/oj/pro/406/) [ZJ](<https://zerojudge.tw/ShowProblem?problemid=c460) 這是去年(106年)全國學科能力競賽資訊科全國賽的pC 分類上算是水題一枚(按照去年整體難度來說)

題目大意略,總之,希望創造出一個軍隊,同時包含對空、範圍、遠距攻擊都有的軍隊

解法

所以如果我們先不看種族,我們先看能力就好,可以看成:

  • 第一位:是否對空,是為 11,否為 00
  • 第二位:是否範圍,是為 11,否為 00
  • 第三位:是否遠距,是為 11,否為 00

所以如果有一個兵種,同時對空、遠距,但是不支援範圍攻擊,則會被寫成這樣:(101)2(101)_2 然後,咦?看起來好像二進位呢!那我們把這個數字看成二進位轉成十進位吧 會發現題目所有數字都不會大於 77,因為數字最大時就是所有功能都有,然後 4+2+1=74 + 2 + 1 = 7

接著是種族,有三種族,所以代號為1,2,31, 2, 3

那麼來做dp陣列的規劃吧 dp[i][j]dp[i][j] 代表:種族為 ii 的某兵種,具有代號為 jj 的功能

然後要求是三種族、三功能都要有,所以那三種兵種的代號做位元運算 or 的時候要為7((111)2(111)_2),並同時包含三種族

呃我這邊可能講的有點不好,但是我當初就是有點直覺得就這樣想 看 code 可能會比較好瞭解,我 code 放下面

code

// by. MiohitoKiri5474
#include<bits/stdc++.h>

using namespace std;

long long dp[5][10];

int main(){
    ios::sync_with_stdio ( false );
    cin.tie ( 0 );
    cout.tie ( 0 );

    long long n, x, y, z, w, ans = 0;
    cin >> n;
    for ( int i = 0 ; i < n ; i++ ){
        cin >> w >> x >> y >> z;
        dp[w][x * 4 + y * 2 + z]++;
    }

    for ( int i = 0 ; i < 8 ; i++ )
        for ( int j = 0 ; j < 8 ; j++ )
            for ( int k = 0 ; k < 8 ; k++ )
                if ( ( i | j | k ) == 7 )
                    ans += dp[1][i] * dp[2][j] * dp[3][k];

    cout << ans << '\n';
}