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));
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章