标签:style blog io os for 2014 sp log c
题目:Alice还有Bob 轮流在已知的15中俄罗斯方块上放置瓷砖,Alice放置的是垂直的2*1的矩形;
Bob放置的是水平的1*2的矩形,Alice 先开始放,最后没位置可以放者输,判断胜者。
分析:博弈,贪心。一看到以为是博弈,结果直接贪心过了。
首先,相同形状的方块压缩,一共有8中不同的方块。得到A,B优先级:
(每次,取自己最优且给对手最大困扰的发难,1只能A拿,2只能B拿,所以最后再用)
A:15 > 5 > 3 > 11 > 7 > 9 > 1; B:15 > 3 > 5 > 11 > 9 > 7 > 2;
按这个策略贪心模拟即可。
说明:(2011-09-19 01:05)。
#include <iostream> #include <cstdlib> using namespace std; int main() { int t,n[ 16 ]; while ( cin >> t ) for ( int i = 1 ; i <= t ; ++ i ) { for ( int j = 1 ; j <= 15 ; ++ j ) cin >> n[ j ]; n[ 3 ] += n[ 4 ]; n[ 5 ] += n[ 6 ]; n[ 7 ] += n[ 8 ]; n[ 9 ] += n[ 10 ]; n[ 11 ] += n[ 12 ]; n[ 11 ] += n[ 13 ]; n[ 11 ] += n[ 14 ]; int A = 2*n[ 1 ],B = 2*n[ 2 ]; // cout << A << " " << B << endl; while ( 1 ) { // cout << "!!!" << endl; if ( n[ 15 ] ) { A += 2; -- n[ 15 ]; }else if ( n[ 5 ] ) { A += 2; -- n[ 5 ]; }else if ( n[ 3 ] ) { A += 1; -- n[ 3 ]; }else if ( n[ 11 ] ) { A += 1; -- n[ 11 ]; }else if ( n[ 7 ] ) { A += 1; -- n[ 7 ]; }else if ( n[ 9 ] ) { A += 1; B += 1; -- n[ 9 ]; }else break; if ( n[ 15 ] ) { B += 2; -- n[ 15 ]; }else if ( n[ 3 ] ) { B += 2; -- n[ 3 ]; }else if ( n[ 5 ] ) { B += 1; -- n[ 5 ]; }else if ( n[ 11 ] ) { B += 1; -- n[ 11 ]; }else if ( n[ 9 ] ) { B += 1; -- n[ 9 ]; }else if ( n[ 7 ] ) { A += 1; B += 1; -- n[ 7 ]; }else break; // cout << "??" << endl; } if ( A > B ) cout << "Case #" << i << ": Alice" << endl; else cout << "Case #" << i << ": Bob" << endl; } return 0; }
标签:style blog io os for 2014 sp log c
原文地址:http://blog.csdn.net/mobius_strip/article/details/39430043