UVA 246 - 10-20-30

题目链接

题意:给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,假设有牌堆形成了下面3种情况(按顺序推断):

1、头两张+尾一张和为10或20或30

2、头一张+尾两张和为10或20或30

3、尾三张和为10或20或30

就把这三张牌拿走,放到总牌堆底(这步要不断运行直到不再满足条件或牌堆没了)

假设有一个牌堆由于这个操作被取完了,那么以后将不在这个位置发牌。

假设最后7个牌堆都能够消掉,那么赢,总牌堆用完,那么输,否则平(即不断循环)

问最后的输赢平,并输出步数

思路:模拟,用一个vector记录下7个牌堆和总牌堆,这样就能够用set去记录状态了,然后每一个牌堆用一个双端队列deque表示,这样满足能够从头也能够从尾巴取,不断模拟就可以

代码:

#include <cstdio>
#include <cstring>
#include <set>
#include <queue>
#include <vector>
using namespace std; int num, zero[8];
vector<deque<int> > piple;
set<vector<deque<int> > > vis; void init() {
vis.clear();
piple.clear();
memset(zero, 0, sizeof(zero));
for (int i = 0; i < 8; i++)
piple.push_back(deque<int>());
piple[7].push_back(num);
for (int i = 0; i < 51; i++) {
scanf("%d", &num);
piple[7].push_back(num);
}
for (int i = 0; i < 7; i++) {
int now = piple[7].front();
piple[7].pop_front();
piple[i].push_back(now);
}
} bool can(int x) {
return (x == 10 || x == 20 || x == 30);
} bool tra1(int i) {
int top1 = piple[i].front();
piple[i].pop_front();
int sum = top1 + piple[i].front() + piple[i].back();
if (can(sum)) {
piple[7].push_back(top1);
piple[7].push_back(piple[i].front());
piple[7].push_back(piple[i].back());
piple[i].pop_front();
piple[i].pop_back();
return true;
}
piple[i].push_front(top1);
return false;
} bool tra2(int i) {
int back1 = piple[i].back();
piple[i].pop_back();
int sum = back1 + piple[i].front() + piple[i].back();
if (can(sum)) {
piple[7].push_back(piple[i].front());
piple[7].push_back(piple[i].back());
piple[7].push_back(back1);
piple[i].pop_front();
piple[i].pop_back();
return true;
}
piple[i].push_back(back1);
return false;
} bool tra3(int i) {
int back1 = piple[i].back();
piple[i].pop_back();
int back2 = piple[i].back();
piple[i].pop_back();
int sum = back1 + back2 + piple[i].back();
if (can(sum)) {
piple[7].push_back(piple[i].back());
piple[7].push_back(back2);
piple[7].push_back(back1);
piple[i].pop_back();
return true;
}
piple[i].push_back(back2);
piple[i].push_back(back1);
return false;
} bool tra(int i) {
if (piple[i].size() < 3) return false;
if (tra1(i)) return true;
if (tra2(i)) return true;
if (tra3(i)) return true;
return false;
} void solve() {
int i = 0;
for (int t = 8; ; t++) {
int now = piple[7].front();
piple[7].pop_front();
piple[i].push_back(now);
while (tra(i));
if (piple[i].size() == 0)
zero[i] = 1;
i = (i + 1) % 7;
if (vis.find(piple) != vis.end()) {
printf("Draw: %d\n", t);
return;
}
vis.insert(piple);
if (piple[7].size() == 0) {
printf("Loss: %d\n", t);
return;
}
if (piple[7].size() == 52) {
printf("Win : %d\n", t);
return;
}
while (zero[i]) i = (i + 1) % 7;
}
} int main() {
while (~scanf("%d", &num) && num) {
init();
solve();
}
return 0;
}

UVA 246 - 10-20-30 (模拟+STL)的更多相关文章

  1. UVA 246 10-20-30 10-20-30游戏 模拟+STL双端队列deque

    Input Each input set consists of a sequence of 52 integers separated by spaces and/or ends of line. ...

  2. 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)

    传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码

  3. 2018.10.20 NOIP模拟 巧克力(trie树+dfs序+树状数组)

    传送门 好题啊. 考虑前面的32分,直接维护后缀trietrietrie树就行了. 如果#号不在字符串首? 只需要维护第一个#前面的字符串和最后一个#后面的字符串. 分开用两棵trie树并且维护第一棵 ...

  4. 2018.10.20 NOIP模拟 面包(数学期望)

    传送门 把方差的式子拆开. 方差=平方的期望-期望的平方. 显然只用维护点对的个数和总方案数就行了. 利用分步的思想来统计. 要统计覆盖一个矩形(x1,y1,x2,y2)(x1,y1,x2,y2)(x ...

  5. 2019.10.20 csp-s模拟测试 lrd试题 反思总结

    赶进度赶进度,丢个代码两三句备注一下完事了. day1: 前面两道题没实际写代码怕印象不深所以描述一下大意. T1: 题目大意:给出两个数&.|.^的结果(可能只给出其中某一项或者某两项),求 ...

  6. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  7. CSP 201612-3 权限查询 【模拟+STL】

    201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权 ...

  8. Codeforces Round #285 (Div. 2) A B C 模拟 stl 拓扑排序

    A. Contest time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  9. 10.8 wtx模拟题题解

    填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...

随机推荐

  1. Unity 图片的灰度处理

    我们平时在做项目时,经常遇到按钮的点击而且还要区分悬浮,点击,禁用的状态,美术要针对一张图片做多个状态图片,资源图片的数量也就增大了,那么打出的包的大小也就跟着上去了,所以我们可以针对原始图片进行Sh ...

  2. jquery 底部导航透明度变化

    如果滚动条到达底部,footer-nav 的透明度为1,否则为0.8: html <div class="footer-nav" id="footer"& ...

  3. 跨域调用webservice

    本人第一次在博客园写博客. 最近研究js的跨域调用,举个小例子. ASP.net 中webservice 源代码 /// <summary>    /// Service1 的摘要说明   ...

  4. codeforces 339C Xenia and Weights(dp或暴搜)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Xenia and Weights Xenia has a set of weig ...

  5. HTTP协议入门知识

    HTTP超文本传输协议,是客户端浏览器和服务器通信的规范,是浏览器与服务器通信的协议,属于应用层的协议,web开发者了解HTTP协议非常重要.浏览器通过http协议请求服务器,完成请求服务器立刻关闭连 ...

  6. jquery获取当前鼠标所在位置的坐标

    $(document).ready(function(){ $(document).mousemove(function(e){ $('#xy').html("X :"+e.pag ...

  7. 在word中使用notepad++实现代码的语法高亮

    转载自:http://blog.csdn.net/woohello/article/details/7621651 有时写文档时需要将代码粘贴到word中,但直接粘贴到word中的代码虽能保持换行与缩 ...

  8. css white-space

    以下是对上面几个属性的测试效果如下: 具体代码如下: <!DOCTYPE html> <html lang="en"> <head> <m ...

  9. sleep函数——Gevent源码分析

    gevent是一个异步I/O框架,当遇到I/O操作的时候,会自动切换任务,从而能异步地完成I/O操作 但是在测试的情况下,可以使用sleep函数来让gevent进行任务切换.示例如下: import ...

  10. HDU 4970 Killing Monsters

    开始以为是线段树,算了一下复杂度也觉得能过...但是这题貌似卡了线段树... 具体做法: 对每一个塔,记录attack[l]+=d,attack[r+1]-=d;这样对于每个block,受到的伤害就是 ...