您的位置:首页 > 其它

UVA - 120 Stacks of Flapjacks

2014-10-30 22:11 447 查看
题目大意:给出一叠煎饼,要求从小达到大排序,排序的时候只能截取子串,然后将子串的倒序。

解题思路:先将输入的值按从小到大排序,然后进行对比,用原数组和排完序后的对比,从最后一个开始对比,如果发现不同的话,就找到那个值,将其翻转到第一个,然后在翻转到原有的位置上即可,这样的话就不会影响到后面的煎饼了

#include<cstdio>
#include<algorithm>
using namespace std;
int num[1000];
int number[1000];
int out[1000] = {0};
int maxn[1000] = {0};

int main() {
	char ch;
	while(scanf("%d",&num[1]) != EOF) {
		number[1] = num[1];
		maxn[1] = num[1];
		int count = 2;
		while( (ch = getchar() ) != '\n' ) {
			scanf("%d", &num[count])	;
			number[count] = num[count];
			maxn[count] = num[count];
			count++;	
		}
		int cnt = 1;
		sort(maxn+1,maxn+count);	
		// i表示最底层的那个煎饼
		for(int i  = count-1; i >= 1; i--)
			if(maxn[i] != num[i]) {//  最后一个不等于当前的值
				int j;
				for(j = i - 1; j >= 1; j--)//找到最后一个所在的位置
					if(num[j] == maxn[i]) 
						break;
				int temp;
				if(j != 1) { //如果最后一个不在最顶层,将其弄到最顶层
					out[cnt++] = count - j;
					for(int k = 0; k < j / 2; k++) {
						temp = num[k+1];
						num[k+1] = num[j-k];
						num[j-k] = temp;	
					}
				}

				for(int k = 0; k < i / 2 ; k++)	 {
					int temp;
					temp = num[k+1];
					num[k+1] = num[i-k];		
					num[i-k] = temp;
				}
				out[cnt++] = count  - i;
			}
		for(int i = 1 ; i < count - 1; i++)
			printf("%d ",number[i]);
		printf("%d\n",number[count-1]);
		for(int i = 1; i < cnt; i++)
			printf("%d ",out[i]);
		printf("%d\n",out[0]);
	} 	
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: