• Uva120 Stacks of Flapjacks


    题意:

      给你一串数字,你可以选择一个位置,将这个位置以上的数字全部翻转过来。问怎么翻转才能把大的放在下面,小的放上面。

    题解:

      先用另一个数组保存最后的结果(大的在下,小的在上,sort一下就好)。然后从最后一个位开始匹配。如果当前位置的数和最后结果不一样,就要把它翻到这里。

      就要在数组里面找到这一个数,先把他翻到最上面,在翻一下就可以到需要的位置了。

      例子:

       4       5       2

       3       3       1

       5    ->   4  ->   4

       1       1       3

       2       2       5

      我们一开始最下面需要放5。先把5翻到最上面,在翻一下就可以到最下面了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <string>
     6 #include <vector>
     7 #include <map>
     8 #include <set>
     9 #include <queue>
    10 #include <sstream>
    11 #include <algorithm>
    12 using namespace std;
    13 #define pb push_back
    14 #define mp make_pair
    15 #define ms(a, b)  memset((a), (b), sizeof(a))
    16 //#define LOCAL
    17 #define eps 0.0000001
    18 typedef long long LL;
    19 const int inf = 0x3f3f3f3f;
    20 const LL INF = 0x7fffffff;
    21 const int maxn = 100+10;
    22 const int mod = 1000000007;
    23 int num[maxn];
    24 int wei[maxn];
    25 void sw(int  x)
    26 {
    27     int t;
    28     for(int i=0;i<=x/2;i++)
    29     {
    30         t = wei[i];
    31         wei[i] = wei[x-i];
    32         wei[x-i] = t;
    33     }
    34 }
    35 void findd(int x, int n,int p){
    36     int i;
    37     for(i=0;i<n;i++){
    38         if(wei[i] == x){
    39             break;
    40         }
    41     }
    42     if(i!=0){
    43         printf("%d ", p-i+1);
    44         sw(i);
    45     }
    46 }
    47 int main() {
    48 #ifdef LOCAL
    49     freopen("jumping.in", "r", stdin);
    50 //      freopen("output.txt", "w", stdout);
    51 #endif // LOCAL
    52     int hh, p=0;
    53     char c;
    54     while(~scanf("%d%c", &hh, &c)){//每次读入2个
    55         num[p] = hh;
    56         wei[p] = hh;
    57         if(c == '
    '){//一行结束
    58             for(int i = 0;i<=p;i++){//一开始需要打印一次
    59                 if(i==0)    printf("%d", num[i]);
    60                 else    printf(" %d", num[i]);
    61             }
    62             printf("
    ");
    63             sort(num, num+p+1)//排序一下,得到结果
    64             for(int i=0;i<=p;i++){//从最后一个开始
    65                 if(num[p-i]!=wei[p-i]){//如果当前位置和最后答案要求不一样
    66                     findd(num[p-i], p-i, p);//在[0, p-i]内找到num[p-i](最后答案),并且交换到最上面
    67                     sw(p-i);//交换
    68                     printf("%d ", i+1);//打印交换位置
    69                 }
    70             }
    71             printf("0
    ");
    72             p = 0;
    73         }
    74         else
    75             p++;
    76     }
    77     return 0;
    78 }
    View Code
  • 相关阅读:
    解决Oracle 11g 或 ODAC 11.2 多客户端版本的乱码问题
    C#.ToString()格式大全
    太阳的眼泪
    oracle database link 12154 tns 无法识别错误的解决方案
    List<T>泛型的Find 和 Where 用法范例
    chrome 下载工具支持
    解决,启动office2007时总出现“正在配置Microsoft Office Professional Plus 2007”的字样
    macOS M1 下pip install安装.whl报错“is not a supported wheel on this platform.
    Mail.Ru Cup 2018 Round 3 B. Divide Candies (数论)
    202120221 BUCT ACM集训队每周程序设计竞赛(8) 问题D :一月忘干净
  • 原文地址:https://www.cnblogs.com/denghaiquan/p/6761348.html
Copyright © 2020-2023  润新知