Problem 2260 Card Game

Accept: 37    Submit: 117
Time Limit: 3000 mSec    Memory Limit : 32768
KB

Problem Description

有如下取牌游戏:

1. 桌面上有n张卡牌从左到右排成一行,每张卡牌上有一个数字;

2. 游戏按轮次进行,每一轮中取掉所有比左边数值小的卡牌;

3. 当无牌可取的时候则游戏结束。

比如初始卡牌为{5, 6, 3, 7, 4, 1, 2},共需2轮取牌。取牌过程如下(小括号为每轮取掉的牌):

{5, 6, 3, 7, 4, 1, 2}

==> {5, 6, (3), 7, (4), (1), 2}

==> {5, 6, 7, 2}

==> {5, 6, 7, (2)}

==> {5, 6, 7}

现按顺序给定初始的卡牌数字,请求出游戏结束时取牌的总轮次,并输出结束时桌上剩余的卡牌序列。

Input

包含多组测试数据。

输入包含两行。

第一行包含一个整数n表示卡牌的数量。

第二行包含n个空格隔开的整数,表示排成一行的卡牌上对应的数字(取值范围[1,1000000000])。

n≤1000000

Output

输出包含两行。

第一行包含一个整数表示游戏的取牌总轮次。

第二行包含游戏结束时桌上剩余的卡牌序列,用空格隔开。

Sample Input

7
5 6 3 7 4 1 2

Sample Output

2
5 6 7 
 
思路:可以用栈来模拟,轮数则可用dp求得。按顺序每次取出当前数字,放往栈中,放进去之前先要与堆顶元素进行比较,若当前元素要小,则直接放入堆中即可;若当前元素大于等于栈顶元素,此时要分两种情况考虑:
1:栈中只剩栈顶元素的情况,此时栈顶元素的下面已经没有元素了,因此已经无法被消除,则一定会出现在最终的卡牌序列中,将之抛出栈中并记录,再将当前元素放入堆中;
2:栈中还有多个元素,此时只要将栈顶元素抛出即可,这一操作意味着如果当前元素被消除,栈顶元素一定在当前元素被消除轮数的前一轮被消除,即可dp求解当前元素被消除的轮数即dp[i]=max(dp[i],dp[k]+1)
上述操作合理性:模拟过程可知如果堆中存在多个元素,那么越是上面的元素数值就越小,也就是说除了栈底元素,其余的最终都将会被消除,因为在它们的左边存在比它们大的数,只是各自会在第几轮消除需要dp递归式的求解。
最后n个元素都被操作一遍之后,对栈进行清理清空操作,操作过程与上述类似。
AC代码:

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<stack>
using namespace std;
#define INF 0x3f3f3f3f
const int N_MAX = +;
int a[N_MAX],n;
stack<int>s;
int dp[N_MAX];
vector<int>res;
int main() {
while (scanf("%d",&n)!=EOF) {
memset(dp, , sizeof(dp));
res.clear();
int term = ;
for (int i = ; i < n; i++)
scanf("%d", &a[i]);
for (int i = ; i < n;i++) {
while (!s.empty() && a[i] >= a[s.top()]) {
if (s.size() == ) {
res.push_back(a[s.top()]);
s.pop();
}
else {
dp[i] = max(dp[i],dp[s.top()]+);
term = max(term,dp[i]);
s.pop();
}
}
s.push(i);
} while (!s.empty()) {
if (s.size() == ) {
res.push_back(a[s.top()]);
s.pop();
}
else {
term = max(term, dp[s.top()] + );
s.pop();
}
}
printf("%d\n",term);
for (vector<int>::iterator it = res.begin(); it != res.end();it++) {
if (it + != res.end())cout << *it << " ";
else cout << *it << endl;
}
} return ;
}

FOJ Problem 2260 Card Game的更多相关文章

  1. FOJ ——Problem 1759 Super A^B mod C

     Problem 1759 Super A^B mod C Accept: 1368    Submit: 4639Time Limit: 1000 mSec    Memory Limit : 32 ...

  2. FOJ Problem 1016 无归之室

     Problem 1016 无归之室 Accept: 926    Submit: 7502Time Limit: 1000 mSec    Memory Limit : 32768 KB  Prob ...

  3. FOJ Problem 1015 土地划分

    Problem 1015 土地划分 Accept: 823    Submit: 1956Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  4. foj Problem 2107 Hua Rong Dao

    Problem 2107 Hua Rong Dao Accept: 503    Submit: 1054Time Limit: 1000 mSec    Memory Limit : 32768 K ...

  5. foj Problem 2282 Wand

     Problem 2282 Wand Accept: 432    Submit: 1537Time Limit: 1000 mSec    Memory Limit : 262144 KB Prob ...

  6. FOJ Problem 2273 Triangles

    Problem 2273 Triangles Accept: 201    Submit: 661Time Limit: 1000 mSec    Memory Limit : 262144 KB P ...

  7. foj Problem 2275 Game

    Problem D Game Accept: 145    Submit: 844Time Limit: 1000 mSec    Memory Limit : 262144 KB Problem D ...

  8. foj Problem 2283 Tic-Tac-Toe

                                                                                                    Prob ...

  9. FOJ Problem 2257 Saya的小熊饼干

                                                                                                        ...

随机推荐

  1. iOS应用架构谈-part1概述

    当我们讨论客户端应用架构的时候,我们在讨论什么? 其实市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: --------------- --------------- ------------ ...

  2. NSOperation、NSOperationQueue

    NSOperation.NSOperationQueue NSOperation 和 NSOperationQueue 配合使用也能实现多线程. NSOperation 继承于 NSObject,是一 ...

  3. Service Mesh是什么技术

    https://blog.csdn.net/weixin_38044696/article/details/80257488 Service Mesh是什么技术 2018年05月09日 22:07:4 ...

  4. IntelliJ IDEA 配置 Tomcat 运行web项目

    运行前提: 配置好 Java 的运行环境 配置好 Tomcat 安装 IntelliJ IDEA 开始 1.创建项目并配置 关于配置SDK,等建完项目再说 没有配置SDK的话 会出现下面的弹框,点击 ...

  5. Python基础——赋值机制

    使用id()函数用于获取对象的内存地址. 使用is来判断是不是指向同一个内存. 把一个对象赋值给另一个对象,两个对象都指向同一个内存地址. test=1000 test1=test id(test) ...

  6. SimpleDateFormat优化写法

    在一个读取数据库数据导出到excel文件的例子当中,每次处理一个时间信息的时候,就需要创建一个SimpleDateFormat实例对象,然后再丢弃这个对象.大量的对象就这样被创建出来,占用大量的内存和 ...

  7. poj 3050 地图5位数问题 dfs算法

    题意:一个5*5地图上面,从任意位置上下左右跳五次,组成一个数.问:不重复的数有多少个? 思路:dfs 从任意位置跳5次,说明每个位置都需要遍历. 组成一个数:number*10+map[dx][dy ...

  8. C指针问题

    <!DOCTYPE html> 多级c指针传值问题 /* GitHub stylesheet for MarkdownPad (http://markdownpad.com) / / Au ...

  9. Tarjan算法及其应用

    Tarjan算法及其应用 引入 tarjan算法可以在图上求解LCA,强连通分量,双联通分量(点双,边双),割点,割边,等各种问题. 这里简单整理一下tarjan算法的几个应用. LCA http:/ ...

  10. 《小团团团队》【Alpha】Scrum Meeting 3

    项目 内容 课程名 软件工程 作业链接地址 Github地址 团队名称 小团团团队 具体目标 1.掌握软件测试基础技术:2.学习迭代式增量软件开发过程(Scrum) 1.1前言 第三天 时间: 201 ...