[刷题]算法竞赛入门经典(第2版) 6-9/UVa127 - "Accordian" Patience
题意:52张牌排一行,一旦出现任何一张牌与它左边的第一张或第三张“匹配”,即花色或点数相同,则须立即将其移动到那张牌上面,将其覆盖。能执行以上移动的只有压在最上面的牌。直到最后没有牌能向左移动。
注意细则:如果同时有多张牌都可以移动,你应该采取的策略是移动最左边可移动的牌。当一张牌既可以移动到左边第一张,又可以移动到左边第三张时,应移动到左边第三张上面。
代码:(Accepted,0.100s)
//UVa127 - "Accordian" Patience
//Accepted 0.100s
//#define _XIENAOBAN_
#include<iostream>
#include<cstdio>
#define NUM 52
#define BIAS 1
using namespace std;
struct card {
char a, b;
bool operator ==(card& that) {
return a == that.a || b == that.b;
}
};
struct stack {
card st[NUM + 2], *p;
void ini() {
p = st + 1;
}
card& pop() {
if (p != st) return *(p--);
return *p;
}
card& top() {
return *p;
}
void push(card& c) {
*++p = c;
}
int size() {
return p - st;
}
bool empty() {
return p == st;
}
}cards[NUM + 3];
struct list {
stack *ls[NUM + 2];
list() {
for (int i(0);i < NUM + 1;++i)
ls[i] = cards + i;
ls[NUM + 1] = nullptr;
}
void erease(int n) {
while (ls[n] != nullptr) {
ls[n] = ls[n + 1];
++n;
}
}
stack& operator [](int i) {
if (i >= 0) return *ls[i];
return *ls[0];
}
};
int main()
{
#ifdef _XIENAOBAN_
#define gets(T) gets_s(T, 129)
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
cards[0].st[1].a = cards[0].st[1].b = 'X'; // 第0个stack的top里储存一个没用的card,使得没有一张卡片与之相等,以方便以后处理前两张左边没牌的牌;
while ((cards[1].st[1].a = getchar()) != '#') {
cards[1].st[1].b = getchar();
getchar();
for (int i(0);i < NUM + 3;++i) cards[i].ini(); // 每个stack里将都只有一张卡片,这个ini就是把top的指针指向1
for (int i(2);i < NUM + 1;++i) { // 数据全部直接作为top读取到stack里面
cards[i].top().a = getchar();
cards[i].top().b = getchar();
getchar();
}
list pile; //处理部分,直接模拟,懒得另写函数了
int num;
for (num = 2;&pile[num];) { // num从2开始,毕竟第一个数据怎么样也移动不了(接下来num再跳回1就懒得管他了)
if (pile[num].top() == pile[num - 3].top()) {
pile[num - 3].push(pile[num].pop());
if (pile[num].empty()) pile.erease(num);
num -= 3;
}
else if (pile[num].top() == pile[num - 1].top()) {
pile[num - 1].push(pile[num].pop());
if (pile[num].empty()) pile.erease(num);
--num;
}
else ++num;
}
printf("%d pile", num - 1);
if (num != 2) printf("s");
printf(" remaining:");
for (int i(1);i < num;++i) printf(" %d", pile[i].size());
puts("");
}
return 0;
}
分析:差不多又是一遍过,而且只用了0.1s,竟然挤进了UVa本题Ranking的前20,虽然题目确实很简单就是了,还是开心的不行。
我的思路是安放52个栈,直接进行模拟操作。从第二张牌开始(毕竟第一张牌不可能向左移动)往下判断,直到到达末尾。
具体流程是,若当前牌可以左移,移之,并且下一个进行判断的牌还是它(因为左侧的都是已经完成的不可能再有可移动的牌了,所以无需重新从最左侧开始检索);反之此牌没法动了,则判断下一张牌。
感觉这不能叫遍历,毕竟期间会向左移动牌,应该算是迭代吧。
要注意的是输出格式!如下图所示,
6 piles remaining: 40 8 1 1 1 1
1 pile remaining: 52
pile/piles的单复数问题。
[刷题]算法竞赛入门经典(第2版) 6-9/UVa127 - "Accordian" Patience的更多相关文章
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci
题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...
- [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A
题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...
- [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation
题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...
- [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile
题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...
- [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536
这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...
- [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities
题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...
- [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary
题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...
- [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web
题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...
随机推荐
- mac下重启apach
打开终端 重启apache:sudo /usr/sbin/apachectl restart 关闭apache:sudo /usr/sbin/apachectl stop 开启apache:sudo ...
- signedCookies
var express = require('../') , request = require('supertest') , cookieParser = require('cookie-parse ...
- Nginx网站使用CDN之后禁止用户真实IP访问的方法
做过面向公网WEB的运维人员经常会遇见恶意扫描.拉取.注入等图谋不轨的行为,对于直接对外的WEB服务器,我们可以直接通过 iptables .Nginx 的deny指令或是程序来ban掉这些恶意请求. ...
- echo print print_r的区别
echo PHP语句 效率最高 输出一个或者多个字符串 print() 函数 效率高 只能打印出简单类型变量的值(如int,string) print_ ...
- Java日期格式化方法
首先获取当前系统时间的方法有两种:第一种可以用currentTimeMillis()方法获取,它其实产生的是一个当前的毫秒数,这个毫秒是自1970年1月1日0时起至现在的毫秒数,类型是long 型,可 ...
- 浅谈HTTP中Get与Post的区别[转载]
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...
- Java--JDBC连接数据库
我们知道Java中的jdbc是用来连接应用程序和数据系统的,本篇文章主要就来看看关于JDBC的实现和使用细节.主要包含以下几点内容: JDBC的基本知识(数据驱动程序) JDBC的连接配置 ...
- [原]node.js使用感想
最近尝试了使用node.js,但因为不是太深入(小项目,还没做完),所以不能谈心得谈经验,就来谈谈使用感想. node.js和以往的cgi接口的服务器+cgi程序(如apache+phpmod)中的单 ...
- 老李推荐:第8章6节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动Monkey 4
在获得比对设备序列号后,findAttachedDevice就会跟提供的序列号进行比对,如果吻合就返回给调用者” 代码8-6-3 AdbBackend - waitForConnection”了.而A ...
- 老李分享:jvm结构简介 1
老李分享:jvm结构简介 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...