題意:烙煎餅,給最多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));
}
}