翻煎饼 Stacks of Flapjacks

题意:本题意为煎饼排序,大的放在上面,小的放在下面(此题输入是从上到下输入的),为煎饼排序是通过一系列的“翻转”动作来完成的。翻转动作就是将一个小铲插到一叠煎饼中的某两个煎饼之间,然后用小铲将上面的所有煎饼翻转(即为将小铲上面的子栈倒转过来)。输出翻转的位置,即小铲上面子栈中最底下一个煎饼的位置号。
解题思路:此题读题的时间比写这题的时间久,本题的解题思路很简单,就是将一定的数组翻转过来,可以用到栈,本题也有一些小技巧,可以先将字符里边的数据先排序,然后找到每一个数字相对应的位置,同时为了简洁函数,可以在外面写一个翻转函数,直接调用就可以了。
代码:
#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的更多相关文章
- UVaOJ 120 - Stacks of Flapjacks
120 - Stacks of Flapjacks 题目看了半天......英语啊!!! 好久没做题...循环输入数字都搞了半天...罪过啊!!! 还是C方便一点...其实C++应该更方便的...C+ ...
- Uva 120 - Stacks of Flapjacks(构造法)
UVA - 120 Stacks of Flapjacks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld &a ...
- uva 120 stacks of flapjacks ——yhx
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data ...
- uva Stacks of Flapjacks
Stacks of Flapjacks 题目链接:Click Here~ 题目描写叙述: ...
- 【思维】Stacks of Flapjacks
[UVa120] Stacks of Flapjacks 算法入门经典第8章8-1 (P236) 题目大意:有一个序列,可以翻转[1,k],构造一种方案使得序列升序排列. 试题分析:从插入排序即可找到 ...
- Stacks of Flapjacks(栈)
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data ...
- Stacks of Flapjacks
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data s ...
- Uva120 Stacks of Flapjacks 翻煎饼
水水题.给出煎饼数列, 一次只能让第一个到第i个数列全部反转,要求把数列排序为升序. 算法点破后不值几钱... 只要想办法把最大的煎饼放到最后一个,然后就变成前面那些煎饼的数列的子题目了.递归或循环即 ...
- UVA - 120 Stacks of Flapjacks(煎饼)
题意:一叠煎饼,每个煎饼都有一个数字,每次可以选择一个数k,把从锅底开始数第k张以及其上面的煎饼全部翻过来,最终使煎饼有序排列(锅顶最小,锅底最大). 分析:依次从锅底向上,优先排数字最大的煎饼.每次 ...
随机推荐
- HDU X mod f(x)(题解注释)
X mod f(x) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 0_Simple__cppOverload
使用cuda内质结构 cudaFuncAttributes 来观察核函数的共享内存.寄存器数量. ▶ 源代码: /*cppOverload_kernel.cuh*/ __global__ void s ...
- 2.安装Nginx
安装稳定版本的nginx 1.为CentOS系统安装yum仓库,创建文件 /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=htt ...
- Android 开发笔记___drawable
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- jQuery选择器(表单元素过滤选择器)第八节
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 整数中1出现的次数(从1到n的整数中1出现的次数)
题目 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.AC ...
- JavaScript面向对象(收集整理)
(1)封装 首先理解构造函数:所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上. f ...
- wkt转换geojson
应用配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o ...
- Vue.js优雅的实现列表清单
一.Vue.js简要说明 Vue.js (读音 /vjuː/) 是一套构建用户界面的渐进式框架.与前端框架Angular一样, Vue.js在设计上采用MVVM模式,当View视图层发生变化时 ...
- SharpGL(46)用Billboard绘制头顶文字
CSharpGL(46)用Billboard绘制头顶文字 本文介绍CSharpGL用Billboard绘制头顶文字的方法.效果如下图所示. 下载 CSharpGL已在GitHub开源,欢迎对OpenG ...