翻煎饼 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张以及其上面的煎饼全部翻过来,最终使煎饼有序排列(锅顶最小,锅底最大). 分析:依次从锅底向上,优先排数字最大的煎饼.每次 ...
随机推荐
- Power Strings(KMP)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 45008 Accepted: 18794 D ...
- 不怕你配置不对,就怕你看的资料不对!MIM 与 SharePoint 同步完全配置指南。
为了更好的同步 User Profile,在 SharePoint 2010 中首次引入了 FIM (ForeFront Identity Manager) 用于编辑 User Profile 的同期 ...
- Maven合并多个war包的工程需要用到的插件
<build> <finalName>WebSite</finalName> <plugins> <!-- 配置war包合并的插件 --> ...
- number 类型转换 符号
function convert(sValue, sDataType) { switch(sDataType) { case “int”: return parseIn ...
- Struts2+Spring+Hibernate实现员工管理增删改查功能(一)之登录功能
昨天的博客中我分享了个人关于ssh实现员工管理的框架整合,今天我在分享管理员登录功能的实现. 转载请注明出处"http://www.cnblogs.com/smfx1314/p/78013 ...
- python基础知识——基于python3.6
语法糖 # # -*- coding: utf-8 -*- # #------------- # #--------- 语法糖--------------- # #------------------ ...
- 开发中关于Git那些事
如果你想精通Git,直接到 Git官网 把这本ProGit掌握已足以Pro Git 此文主要介绍一切开发中常用的git命令和一些配置技巧(诸如git别名配置,log打印技巧,版本回退以及分支管理等). ...
- JavaScript:在JS中截取字符串的方法
这篇主要说一说截取字符串的方法,用于帮助自己缕清方法的作用,参数的意义,返回值,是否对于原来的字符串进行了操作等. 在javascript中,常见的截取字符串的方法有slice().substring ...
- Python小爬虫
网页解析器下载网址: http://www.crummy.com/software/BeautifulSoup/ ...
- [转载] 基于Redis实现分布式消息队列
转载自http://www.linuxidc.com/Linux/2015-05/117661.htm 1.为什么需要消息队列?当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消 ...