题意:本题意为煎饼排序,大的放在上面,小的放在下面(此题输入是从上到下输入的),为煎饼排序是通过一系列的“翻转”动作来完成的。翻转动作就是将一个小铲插到一叠煎饼中的某两个煎饼之间,然后用小铲将上面的所有煎饼翻转(即为将小铲上面的子栈倒转过来)。输出翻转的位置,即小铲上面子栈中最底下一个煎饼的位置号。

解题思路:此题读题的时间比写这题的时间久,本题的解题思路很简单,就是将一定的数组翻转过来,可以用到栈,本题也有一些小技巧,可以先将字符里边的数据先排序,然后找到每一个数字相对应的位置,同时为了简洁函数,可以在外面写一个翻转函数,直接调用就可以了。

代码:

 #include<stdio.h>
#include<stack>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int a[],b[];
stack<int> q;
int main(){
freopen("in.txt","r",stdin);
int num=;
while(scanf("%d",&a[num])!=EOF){
memset(b,,sizeof(b));
while(getchar()!='\n'){
scanf("%d",&a[++num]);
}
for(int i=;i<=num;i++){
printf("%d%c",a[i],i==num?'\n':' ');
}
for(int i=;i<=num;i++){
b[i]=a[i];
}
sort(b+,b+num+);
for(int i=num;i>;i--){
if(a[i]==b[i]) continue;
else if(a[]==b[i]){
printf("%d ",num-i+);
for(int j=;j<=i;j++){
q.push(a[j]);
}
for(int j=;j<=i;j++){
a[j]=q.top();
q.pop();
}
}
else{
int pos;
for(int j=;j<=i;j++){
if(a[j]==b[i]){
pos=j;
break;
}
}
printf("%d ",num-pos+);
printf("%d ",num-i+);
for(int j=;j<=pos;j++){
q.push(a[j]);
}
for(int j=;j<=pos;j++){
a[j]=q.top();
q.pop();
}
for(int j=;j<=i;j++){
q.push(a[j]);
}
for(int j=;j<=i;j++){
a[j]=q.top();
q.pop();
}
}
}
num=;
printf("0\n");
memset(a,,sizeof(a));
}
}

同时附上一位大神的代码:(代码出处:http://www.cnblogs.com/devymex/archive/2010/08/15/1799844.html)

 #include <algorithm>
#include <iostream>
#include <iterator>
#include<stdio.h>
#include <deque>
#include <string>
#include <sstream>
using namespace std;
//主函数
int main(void) {
freopen("in.txt","r",stdin);
//循环处理输入的每组字符串。每次循环一轮要输出最后的0和换行
for (string strLine; getline(cin, strLine); cout << '' << endl) {
//按要求回应输入的字符串行
cout << strLine << endl;
//构造字符串流,以遍转换为数字
istringstream iss(strLine);
//将字符串转为数字,逆序(最底的在最前)存储在Stack里
deque<int> Stack;
for (int nDiam; iss >> nDiam; Stack.push_front(nDiam));
//从底依次上向进行翻转,保持i上面的都比i小
for (deque<int>::iterator i = Stack.begin(); i != Stack.end(); ++i) {
//找出i上面(包括i)的最大元素
deque<int>::iterator iMax = max_element(i, Stack.end());
//如果最大元素就是i则继续(将i指向上面一个)
if (iMax != i) { //否则要进行需翻转操作
//如果最大的不在最上面,则需先翻转到最上面
if (iMax != Stack.end() - ) {
reverse(iMax, Stack.end());
//输出翻转的起点
cout << distance(Stack.begin(), iMax) + << ' ';
}
//将最大的从最上面翻转到i的位置上
reverse(i, Stack.end());
//输出翻转的起点
cout << distance(Stack.begin(), i) + << ' ';
}
}
}
return ;
}

本人觉得以上代码写得特别优美,特附上。

翻煎饼 Stacks of Flapjacks的更多相关文章

  1. UVaOJ 120 - Stacks of Flapjacks

    120 - Stacks of Flapjacks 题目看了半天......英语啊!!! 好久没做题...循环输入数字都搞了半天...罪过啊!!! 还是C方便一点...其实C++应该更方便的...C+ ...

  2. Uva 120 - Stacks of Flapjacks(构造法)

    UVA - 120  Stacks of Flapjacks Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld &a ...

  3. uva 120 stacks of flapjacks ——yhx

     Stacks of Flapjacks  Background Stacks and Queues are often considered the bread and butter of data ...

  4. uva Stacks of Flapjacks

                                                     Stacks of Flapjacks  题目链接:Click Here~ 题目描写叙述:     ...

  5. 【思维】Stacks of Flapjacks

    [UVa120] Stacks of Flapjacks 算法入门经典第8章8-1 (P236) 题目大意:有一个序列,可以翻转[1,k],构造一种方案使得序列升序排列. 试题分析:从插入排序即可找到 ...

  6. Stacks of Flapjacks(栈)

     Stacks of Flapjacks  Background Stacks and Queues are often considered the bread and butter of data ...

  7. Stacks of Flapjacks

    Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data s ...

  8. Uva120 Stacks of Flapjacks 翻煎饼

    水水题.给出煎饼数列, 一次只能让第一个到第i个数列全部反转,要求把数列排序为升序. 算法点破后不值几钱... 只要想办法把最大的煎饼放到最后一个,然后就变成前面那些煎饼的数列的子题目了.递归或循环即 ...

  9. UVA - 120 Stacks of Flapjacks(煎饼)

    题意:一叠煎饼,每个煎饼都有一个数字,每次可以选择一个数k,把从锅底开始数第k张以及其上面的煎饼全部翻过来,最终使煎饼有序排列(锅顶最小,锅底最大). 分析:依次从锅底向上,优先排数字最大的煎饼.每次 ...

随机推荐

  1. 哈尔滨理工大学第六届程序设计团队 I-Team

    /* 以前做过一个插队的题,这个类似从后往前操作 */ #include <iostream> #include <stdio.h> #include <algorith ...

  2. SSH服务详解

    第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Group )制定:在进行数 ...

  3. position:sticky 定位 position:fixed

    它的表现类似position:relative和position:fixed的合体,当目标区域在屏幕中可见时,它的行为就像position:relative; 而当页面滚动超出目标区域时,它的表现就像 ...

  4. mysql +keeplive

    下载tar包 ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6. ...

  5. Spring各jar包作用及依赖

    先附spring各版本jar包下载链接http://repo.spring.io/release/org/springframework/spring/ spring.jar 是包含有完整发布模块的单 ...

  6. 数据库(概念、语法、DBMS、SQL语言:创建数据库、表格,添加、修改、删除数据记录)

    关系型数据库:以表作为实体,以主键和外键关系作为联系的一种数据结构. 主键:在关系型数据库中,用一个唯一的标识符来标志每一行,这个标识符就是主键.主键有两个特点:非空和不能重复. 外键:在关系型数据库 ...

  7. javaWeb内置对象

    jsp内置对象是web容器创建的一组对象. jsp内置对象的名称是jsp的保留字. jsp内置对象是可以直接在jsp页面使用的对象,无需使用new获取实例. jsp九大内置对象 1.request 2 ...

  8. c# asp.net 多数组索引的解决方法

    本人今天做了一个功能 需要在一个类里用多个数组, 数组需要索引器来调用  一个数组 我查了msdn 一个类里面只能有一个this 索引器 那这么多数组如何构造索引呢 我在坛子里找到了解决之道 view ...

  9. linux服务器上Apache配置多域名

    一, 打开httpd.conf 二 找到如下三个位置配置如下 DocumentRoot "/data" #以下这个配置是紧挨着的,有两个 <Directory "/ ...

  10. Vuex非常适合新手的教程,保教不会!

    本讲解基于Vue-cli(脚手架)搭建的项目. Vuex 数据状态管理工具,整个流程类似依赖注入,相当于预先定义,倒推.(个人理解) 1. 安装vuex  命令行输入 npm install vuex ...