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. springMVC3学习(六)--SimpleFormController

    SimpleFormController提交表单流程例如以下: login.jsp <form action="login" method="post"& ...

  2. GDI+创建Graphics对象的2种方式

      1.this.CreateGraphics()     // 调用控件的CreateGraphics()方法 2.在OnPaint事件中,PaintEventArgs类型的参数e对象的Graphi ...

  3. Glide的加载图片的帮助类,用来把图片圆角或者改成圆形图片

    Glide虽然非常好用但是没找到把图片圆角的方法,所以百度了一个非常不错的加载类自己实现圆角图 感谢原文章作者:http://blog.csdn.net/weidongjian/article/det ...

  4. Cisco cmd命令(三)动态路由协议

    路由选择协议:1.矢量距离协议 2.链路状态协议 RIP路由选择协议:1.使用矢量距离协议 2.RIPv1只能使用有类路由 3.RIPv2可以使用无类路由 路由更新定时器:用于将路由器本身完整的路由选 ...

  5. EasyuiCombobox三级联动

    有许多刚接触Easyui中Combobox控件的朋友可能都会遇到的问题:如何将Combobox做成三级联动? 先本人有个三级联动的案例给大家参考参考,经测试能通过.注意Combobox绑定的数据是Js ...

  6. Entity Framework 6.1-Code First【转】

      Entity Framework 6.1-Code First 分类: Entity Framework 2014-04-21 14:56 2034人阅读 评论(0) 收藏 举报 entityen ...

  7. iOS-设计模式之代理反向传值

    代理设计模式就是自己的方法自己不实现,让代理对象去实现. 可以让多个类实现一组方法. 委托模式的好处在于: 1.避免子类化带来的过多的子类以及子类与父类的耦合 2.通过委托传递消息机制实现分层解耦 代 ...

  8. JS截取字符串:slice(),substring()和substr()

    var string='abcdefg' 1.slice() string.slice(startLocation [, endLocation]) ps1:2个参数可以为负数,若参数值为负数,则将该 ...

  9. MySql移植到嵌入式Linux平台

    最近在做考勤机系统,硬件采用的cortex-A8,哈哈,其实是有点浪费的,2410就可以的.所以就要考虑到考勤数据的存储问题,本来是打算用sqlite数据库存储的,可是后来发现,这个数据库只是一个本地 ...

  10. 【Lucene4.8教程之五】Luke

    一.Luke基本内容 1.Luke简介 Luke可用于查看Lucene创建的索引,并对其进行基本操作. 2.创建Luke (1)从Github上下载源文件 https://github.com/tar ...