您的位置:首页 > 其它

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

2016-05-31 22:44 399 查看
题意:烙煎饼,给最多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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  UVA 算法设计