TopCoder14580: EllysRPS
题意
\(yyb\)要去与\(m\)\((m\le100)\)个人玩游戏
由于\(yyb\)忙着切大火题,他没有太多的精力浪费在游戏上
所以仁慈的\(yyb\)决定放\(m\)个人一条生路,不吊打他们
然而\(yyb\)为了维护自己红太阳的形象,不能输,所以他希望与每个人玩游戏都能是平局
游戏很简单,就是石头剪刀布,\(yyb\)会与每个人玩\(n(n\le 20)\)场
只要双方赢的次数相同就视为平局
\(yyb\)非常的强,所以大家每一场比赛想出什么\(yyb\)一眼就看出来了
每个人的策略都是一个长度为\(n\)的序列
然后他觉得能用同一个长度为\(n\)的策略序列与每个人打平局
然而\(yyb\)并不满足与这些,他想知道自己有多少种方式打平,这样他就能知道别人比自己弱多少,从而增长自己的淫威
正如大家所知,\(yyb\)秒题入魔,懒得去想这个\(naive\)的比赛
所以请比他弱的你来帮他求出这个方案数
Sol
\(meet \ in \ the \ midlle\)
爆搜,把状态开\(vector\)压进\(map\)查询
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
typedef vector <int> vi;
IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int win[3][3] = {{0, -1, 1}, {1, 0, -1}, {-1, 1, 0}};
int n, m, a[105][25], b[25], mid;
vi tmp;
map <vi, int> t;
ll ans;
IL void Record(){
tmp.clear();
for(RG int i = 1; i <= m; ++i){
RG int cnt = 0;
for(RG int j = 1; j <= mid; ++j) cnt += win[a[i][j]][b[j]];
tmp.push_back(cnt);
}
++t[tmp];
}
IL void Dfs1(RG int l){
if(l > mid){
Record();
return;
}
for(RG int i = 0; i < 3; ++i) b[l] = i, Dfs1(l + 1);
}
IL void Calc(){
tmp.clear();
for(RG int i = 1; i <= m; ++i){
RG int cnt = 0;
for(RG int j = mid + 1; j <= n; ++j) cnt -= win[a[i][j]][b[j]];
tmp.push_back(cnt);
}
ans += t[tmp];
}
IL void Dfs2(RG int l){
if(l > n){
Calc();
return;
}
for(RG int i = 0; i < 3; ++i) b[l] = i, Dfs2(l + 1);
}
IL ll Solve(){
mid = (1 + n) >> 1;
Dfs1(1), Dfs2(mid + 1);
return ans;
}
class EllysRPS{
public:
ll getCount(vector <string> s){
m = s.size(), n = s[0].size();
for(RG int i = 1; i <= m; ++i)
for(RG int j = 1; j <= n; ++j)
if(s[i - 1][j - 1] == 'R') a[i][j] = 0;
else a[i][j] = (s[i - 1][j - 1] == 'S') + 1;
return Solve();
}
};
TopCoder14580: EllysRPS的更多相关文章
- Meet in the middle学习笔记
Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...
随机推荐
- 考试题T3
题意分析 这题一看没有什么思路 幸好我们机房的红太阳\(ghj1222\)切了这道题 首先我们考虑风跑一个来回之后人怎么样 就是跑了一个区间 也就是风跑了若干个来回之后 人跑了若干个区间 所以我们考虑 ...
- SHELL脚本扩展
使用SED命令 sed称为流编辑器,命令格式如下: sed option script file -e script #指定多个命令 -f script_file #指定命令文件 -n #不需要为每个 ...
- date命令的基本用法
date设置时间 设置时间:-s参数 date -s "20190426 15:22:33" date查看时间差 (-d参数多用于脚本) 查看时间差:-d参数date -d &q ...
- centos7嵌入式环境搭建
1. 在网上搜索下载交叉编译器arm-linux-gcc文件,我下载的是:arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 ...
- Android 4.4 KitKat终于支持录屏(Screen Recording)了!
本文介绍了Android 4.4 KitKat系统新增加的录屏功能以及录屏方法,和限制因素.如果App由于版权方面的原因,不想被记录屏幕录像的话,APP只需要在相应的SurfaceView请求“Sur ...
- 第3章—高级装配—bean的作用域
bean的作用域 bean的默认作用域 Spring定义了多种作用域,可以基于这些作用域创建bean,包括: 单例(Singleton):在整个应用中,只创建bean的一个实例. 原型(Prototy ...
- sizeof数组名和字符指针是有区别的
sizeof数组名和字符指针是有区别的. #include <stdio.h> #include <stdlib.h> void change(char url[]); int ...
- SQL注入原理讲解
1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号.密码等互 ...
- CSS小技巧(一)
左右布局 将内部的子元素加浮动,父元素清除浮动即可. 代码: <!DOCTYPE html> <html> <head> <title>test< ...
- Delphi下OpenGL2d绘图(05)-画图片Bmp
一.前言 找了不少资料,要画图片要先处理一下,需要引用别的单元,Delphi中没带,需要另外下载Gl.pas.看网上说是自带的OpenGl单元封装的是1.0版的,有此函数未声明.网上可以找到Gl.pa ...