• 【思维】Stacks of Flapjacks


    [UVa120] Stacks of Flapjacks

    算法入门经典第8章8-1 (P236)

    题目大意:有一个序列,可以翻转[1,k],构造一种方案使得序列升序排列。

    试题分析:从插入排序即可找到思路。每次我们优先地将没有到自己位置上的、最大的数挪到自己的位置上。

         为什么可以这样做呢?难道不会改变已经排好序的么。

         不会,因为我们从大往小处理,翻转的是前面的一段,而排好序的是后面一段,因此肯定不会打乱后面的。

         对于每一个数,设其下标为pos,已经排好序的有x个,那么我们先将pos其变为1,即翻转[1,pos],然后将其翻转到N-x那里去,所以再翻转[1,N-x]。

    代码:

     

    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    #define LL long long
    
    inline int read(){
    	int x=0,f=1;char c=getchar();
    	for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    	for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    	return x*f;
    }
    const int INF=9999999;
    const int MAXN=100000;
    
    int a[MAXN+1]; 
    int cnt; int N,M; 
    char str[MAXN+1];
    int b[MAXN+1];
    
    bool cmp(int a,int b){
    	return a>b;
    }
    int ret;
    void ref(int k){
    	for(int i=1;i<=k/2;i++)
    		swap(a[i],a[k-i+1]);
    	return ;
    }
    int ans[MAXN+1];
    
    int main(){
    	while(scanf("%d",&a[1])!=EOF){
    		ret=0;
    		gets(str); cnt=1;
    		int len=strlen(str);
    		for(int i=0;i<len;i++){
    			if(str[i]==' ') continue;
    			else {
    				int p=i+1;
    				int sum=str[i]-'0';
    				while(isdigit(str[p])){
    					sum=sum*10+str[p]-'0';
    					++p;
    				}
    				i=p;
    				a[++cnt]=sum;
    			}
    		}
    		N=cnt;
    		for(int i=1;i<=N;i++) b[i]=a[i];
    		for(int i=1;i<N;i++) printf("%d ",b[i]);
    		printf("%d
    ",b[N]);
    		sort(b+1,b+N+1,cmp);
    		for(int i=1;i<=N;i++){
    			int tmp;
    			for(int j=1;j<=N;j++){
    				if(a[j]==b[i]) {
    					tmp=j; break;
    				}
    			}
    			if(tmp==b[i]) continue;
    			if(tmp!=1){
    				ans[++ret]=N-tmp+1;
    				ref(tmp);
    			}
    			if(b[i]!=1){
    				ans[++ret]=i; 
    				ref(N-i+1);
    			}
    		}
    		for(int i=1;i<=ret;i++) printf("%d ",ans[i]);
    		puts("0");
    	}
    	return 0;
    }
    

     

      

     

  • 相关阅读:
    看我如何破解一台自动售货机
    充满未来和科幻的界面设计FUI在国内还没有起步在国外早起相当成熟
    libuv之介绍
    纯净版xp系统在局域网共享需要密码如何解决
    xp局域网共享设置
    Qt5设置应用程序图标
    我们为什么以及是如何从 Angular.js 迁移到 Vue.js?
    [转]聊聊技术选型
    VueJS如何引入css或者less文件的一些坑
    tomcat启动不成功(点击startup.bat闪退)的解决办法
  • 原文地址:https://www.cnblogs.com/wxjor/p/7502178.html
Copyright © 2020-2023  润新知