例题8-1 煎饼 UVa120

1.题目描述:点击打开链接

2.解题思路:本题利用贪心法解决,按照题意,可以先复制原队列,并排好序,从大到小以此把每个数排到正确位置,方法是:先翻到上面,再翻到正确位置,每翻一次,都要判断队列是否已经排好,如果本来就在最顶层,或局部和排过序的队列相同,可以跳过,无需翻转

3.代码:

#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

const int maxn = 30 + 10;
int a[maxn], r[maxn];
int maxd, pos, cnt;
bool is_ok(int cnt, int*a)
{
	for (int i = 0; i < cnt; i++)
	if (a[i] != r[i])return false;
	return true;
}
void invert(int start)//将0到start之间的数翻转
{
	int temp[maxn];
	memcpy(temp, a, sizeof(int)*(start + 1));
	for (int i = 0; i <= start; i++)
		a[i] = temp[start - i];
}
void solve(int end, int m)
{
	int ok = 0;
	for (int i = end; i >= 0; i--)
	{
		if (a[i] == m)//找到m的位置
		{
			ok = 1;
			if (i)//如果是最顶层,无需翻转
			{
				printf("%d ", cnt - i);
				invert(i);
			}
			if (!is_ok(cnt, a) && end)//如果没有排好或没有扫描到最顶层
			{
				printf("%d ", cnt - end);
				invert(end);
			}
			else break;
		}
		if (ok)break;
	}
}
int main()
{
	string str;
	while (getline(cin, str))
	{
		cnt = 0;
		maxd = 0;
		memset(a, 0, sizeof(a));
		memset(r, 0, sizeof(r));
		stringstream ss(str);
		int tmp;
		while (ss >> tmp)
		{
			a[cnt]=tmp;
			if (a[cnt] > maxd)
			{
				maxd = a[cnt];
				pos = cnt;
			}
			cnt++;
		}
		for (int i = 0; i < cnt; i++)
			printf("%d%c", a[i], i == cnt - 1 ? '\n' : ' ');
		memcpy(r, a, sizeof(a));
		sort(r, r + cnt);
		for (int i = cnt - 1; i >= 0; i--)//按照从大到小顺序一个个处理
		if (a[i] == r[i])continue;//局部相同,跳过
		else if (!is_ok(cnt, a))solve(i, r[i]);
		printf("0\n");
	}
	return 0;
}

另外,我找到了一份很随性的STL代码,供参考学习

 

#define _CRT_SECURE_NO_WARNINGS 
#include<bits/stdc++.h>
using namespace std;
int main()
{
	string str;
	for(;getline(cin,str);cout<<0<<endl)
	{
		cout<<str<<endl;
		istringstream iss(str);
		deque<int> a;
		for(int i;iss>>i;a.push_front(i));
		
		for(deque<int>::iterator i=a.begin();i!=a.end();++i)
		{
			deque<int>::iterator Max=max_element(i,a.end());
			if(Max!=i)
			{
				if(Max!=a.end()-1)
				{
					reverse(Max,a.end());
					cout<<distance(a.begin(),Max)+1<<" ";
				}
				reverse(i,a.end());
				cout<<distance(a.begin(),i)+1<<" ";
			}
		}
	}
	return 0;
}




你可能感兴趣的:(uva,贪心法)