枯槐树下乘凉

还会写点代码的咸鱼

UVA 120 Stacks of Flapjacks (模拟+贪心)

题意:烙煎饼,给最多30个煎饼,每个煎饼对应一个数字,数字的序列可能是无序的,每个煎饼对应的编号是n~1(换句话说,第一个煎饼的编号是n,以此类推),你可以做这种操作:选取一个煎饼k,可以使得k~n之间的煎饼反转。最终经过多次这种操作使得煎饼的数字排列是升序的,要求输出先后选取的所有的k值

注意给的数字可能是重复的

代码如下:

#include<iostream>
#include<sstream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
char str[35];
int a[35];
int k;
int findMax(int endPos)
{
    int pos=1,maxx=a[1];
    for(int i=2; i<=endPos; i++)
        if(a[i]>=maxx) pos=i,maxx=a[i];
    return pos;
}
bool pan()
{
    int s=a[1];
    for(int i=2; i<k; i++)
        if(a[i]<s) return false;
    return true;
}
void iReverse(int len)
{
    for(int i=1; i<=len/2; i++)
    {
        int t;
        t=a[i],a[i]=a[len-i+1],a[len-i+1]=t;
    }
}
int main()
{
    vector<int> road;
    memset(str,0,sizeof(str));
    while(gets(str))
    {
        road.clear();
        k=1;
        int x;
        stringstream s(str);
        while(s>>x) a[k++]=x;
        int lim=k-1;
        while(true)
        {
            int maxPos=findMax(lim);
            if(maxPos!=lim)
            {
                if(maxPos!=1)
                {
                    road.push_back(k-maxPos);
                    iReverse(maxPos);
                }
                if(pan()) break;
                road.push_back(k-lim);
                iReverse(lim);
            }
            lim--;
        }
        printf("%s\n",str);
        if(!road.empty()){
        cout<<road[0];
        for(int i=1; i<road.size(); i++)
            cout<<" "<<road[i];
        cout<<" "<<"0"<<endl;}
        else cout<<"0"<<endl;
        memset(str,0,sizeof(str));
    }
}



阅读更多
版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/kuhuaishuxia https://blog.csdn.net/KuHuaiShuXia/article/details/51549913
文章标签: UVA 算法设计
个人分类: 解题报告
上一篇UVA 11214 Guarding the Chessboard (迭代)
下一篇UESTC 482 Charitable Exchange (dijkstra)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭