第9回ブルーブリッジカップ(国試合)——レーザースタイル
12765 ワード
【問題の説明】
x星の盛大な祝日は雰囲気を高めるために、30台の机光器で一列に並び、宇宙に光柱を打ち出す.デバッグをインストールしたところ、なぜか隣接する2台のレーザが同時に開かないことがわかりました!王は、このようなバグが存在する場合、全部で何種類のレーザー効果を出すことができるか知りたいと思っています.明らかに、3台の機械しかなければ、全部で5つのスタイルになることができます.1、全部閉めます(sorry、この時は音がなくて音がします.これも1つです).2、1台開けます.3種類3、2台開けます.1種類だけですが、30台はよくありません.王はあなたに手伝ってもらうしかありません.
【答えの提出】30台のレーザで形成できるパターン種数を示す整数を提出することが要求される.整数は1つだけ提出し、余分な内容を記入しないでください.
答え:2178309
暴力&ビット演算を解く:プログラムは20 s実行する
問題解2 DFS:
3つの動的計画を解く:
x星の盛大な祝日は雰囲気を高めるために、30台の机光器で一列に並び、宇宙に光柱を打ち出す.デバッグをインストールしたところ、なぜか隣接する2台のレーザが同時に開かないことがわかりました!王は、このようなバグが存在する場合、全部で何種類のレーザー効果を出すことができるか知りたいと思っています.明らかに、3台の機械しかなければ、全部で5つのスタイルになることができます.1、全部閉めます(sorry、この時は音がなくて音がします.これも1つです).2、1台開けます.3種類3、2台開けます.1種類だけですが、30台はよくありません.王はあなたに手伝ってもらうしかありません.
【答えの提出】30台のレーザで形成できるパターン種数を示す整数を提出することが要求される.整数は1つだけ提出し、余分な内容を記入しないでください.
答え:2178309
暴力&ビット演算を解く:プログラムは20 s実行する
#include
using namespace std;
inline int judge(int x, int k) // inline , 50s
{
return x >> k & 1; // x k 1
}
int main()
{
int ans = 0;
for (int i = 0; i < 1 << 30; i ++)
{
bool flag = true;
for (int j = 1; j < 30; j ++)
if(judge(i, j) && judge(i, j - 1))
{
flag = false;
break;
}
ans += flag;
}
cout << ans << endl;
return 0;
}
問題解2 DFS:
#include
using namespace std;
int ans;
const int N = 30;
bool st[N];
void dfs(int u)
{
if(u == 30)
{
ans ++;
return;
}
//
dfs(u + 1); // 1、
if(!st[u - 1]) // 2、
{
st[u] = true;
dfs(u + 1);
st[u] = false;
}
}
int main()
{
dfs(0);
cout << ans << endl;
return 0;
}
3つの動的計画を解く:
#include
using namespace std;
int main()
{
int f[30][2];
f[3][0] = 3; // 3 , , 3
f[3][1] = 2; // 3 , , 2
for (int i = 4; i <= 30; i ++)
{
f[i][0] = f[i - 1][0] + f[i - 1][1]; // 0, 0, 1
f[i][1] = f[i - 1][0]; // 1, 0
}
cout << f[30][0] + f[30][1] << endl;
return 0;
}