uva120

题意:给出n张煎饼,从上到下输入,每张煎饼上面都有一个数字,厨师每次可以选择第k张煎饼,

进行翻转操作,设计一种方法使得所有煎饼按照从小到大排序(最上面的煎饼最小)。输出需要翻转

的次数,如果已经结束不需要翻转输出0。

max_element(first,last)输出最大元素的位置

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<sstream>
using namespace std;
int n;
int a[10005];
string s;
void solve(int p)
{
    for(int i=0;i<p-i;i++)
    {
        swap(a[i],a[p-i]);
    }
    cout<<n-p<<" ";
}
int main()
{
    while(getline(cin,s))
    {
        cout<<s<<endl;
        stringstream ss(s);
        n=0;
        while(ss>>a[n])
            n++;
        for(int i=n-1;i>0;i--)
        {
            int p=max_element(a,a+i+1)-a;//查找最大元素的位置
            if(p==i)//如果=i则说明它在自己的位置上
                continue;
            if(p>0)//否则将最大元素翻转到顶部
                solve(p);
            solve(i);//翻转到符合条件的位置
        }
        cout<<"0"<<endl;
    }
}
时间: 2024-10-07 20:55:34

uva120的相关文章

uva120 Stacks of Flapjacks (构造法)

这个题没什么算法,就是想出怎么把答案构造出来就行. 思路:越大的越放在底端,那么每次就找出还没搞定的最大的,把它移到当前还没定好的那些位置的最底端,定好的就不用管了. 这道题要处理好输入,每次输入的一行中是带空格的,以换行符结束一组数据的输入,那么用getline()函数.再用stringstream(这个可以自动转格式),非常方便的就处理了输入的问题.另外注意max_element和min_element都是左闭右开的. #include<iostream> #include<cstd

UVa120 - Stacks of Flapjacks (STL)

Background 背景 Stacks and Queues are often considered the bread and butter of data structures and find use in architecture, parsing, operating systems, and discrete event simulation. Stacks are also important in the theory of formal languages. 栈和队列常常被

UVa120 Stacks of Flapjacks (构造法)

链接:http://vjudge.net/problem/18284 分析:摊煎饼问题.以从大到小的顺序依次把每个数排到正确的位置,比如当处理第i大的煎饼时,是不会影响到第1,2,3,...,i-1大的煎饼的(它们已经正确的翻到了煎饼堆底部的i-1个位置上),翻煎饼的方法是先翻到最上面,然后翻到正确的位置,翻好了以后煎饼堆底部i个位置上的煎饼都已经正确放好就不用管了,接下来就是找第i+1大的煎饼放到下数上第i+1个位置上,不过对于当前最大煎饼的位置要分类讨论,如果已经在其正确位置上就什么也不用做

UVA120(煎饼)

这个题唯一坑爹的地方就是UVA给的udebug数据是错的,害得我头疼了半天... 思路就是依次找最大的数把它转到最低端,每次执行的时候判断一下是否已经符合题意,符合则跳出循环. 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <vector> 6 7 using namespace std; 8 int

Uva120 Stacks of Flapjacks

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int a[31],n; 6 7 void rev(int ct) { 8 printf("%d ", n-ct); 9 for (int i=0;i<=ct/2;++i) 10 swap(a[i],a[ct-i]); 11 } 12 13 int scan() 14 { 15

第八章 高效算法设计

分治法求最大连续和 注意范围是[x,y) #include<bits/stdc++.h> using namespace std; int maxsum(int *A,int x,int y){ if(y-x==1) return A[x]; int m=x+(y-x)/2; int maxs = max(maxsum(A,x,m),maxsum(A,m,y)); int v,L,R; v=0; L=A[m-1]; for(int i=m-1;i>=x;i--) L=max(L,v+=A

【思维】Stacks of Flapjacks

[UVa120] Stacks of Flapjacks 算法入门经典第8章8-1 (P236) 题目大意:有一个序列,可以翻转[1,k],构造一种方案使得序列升序排列. 试题分析:从插入排序即可找到思路.每次我们优先地将没有到自己位置上的.最大的数挪到自己的位置上. 为什么可以这样做呢?难道不会改变已经排好序的么. 不会,因为我们从大往小处理,翻转的是前面的一段,而排好序的是后面一段,因此肯定不会打乱后面的. 对于每一个数,设其下标为pos,已经排好序的有x个,那么我们先将pos其变为1,即翻