[TOJ][406] C. 軍隊部署
題目
老樣子先放連結 [TOJ](<http://toj.tfcis.org/oj/pro/406/) [ZJ](<https://zerojudge.tw/ShowProblem?problemid=c460) 這是去年(106年)全國學科能力競賽資訊科全國賽的pC 分類上算是水題一枚(按照去年整體難度來說)
題目大意略,總之,希望創造出一個軍隊,同時包含對空、範圍、遠距攻擊都有的軍隊
解法
所以如果我們先不看種族,我們先看能力就好,可以看成:
- 第一位:是否對空,是為 ,否為
- 第二位:是否範圍,是為 ,否為
- 第三位:是否遠距,是為 ,否為
所以如果有一個兵種,同時對空、遠距,但是不支援範圍攻擊,則會被寫成這樣: 然後,咦?看起來好像二進位呢!那我們把這個數字看成二進位轉成十進位吧 會發現題目所有數字都不會大於 ,因為數字最大時就是所有功能都有,然後
接著是種族,有三種族,所以代號為
那麼來做dp陣列的規劃吧 代表:種族為 的某兵種,具有代號為 的功能
然後要求是三種族、三功能都要有,所以那三種兵種的代號做位元運算 or 的時候要為7(),並同時包含三種族
呃我這邊可能講的有點不好,但是我當初就是有點直覺得就這樣想 看 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';
}