zoukankan      html  css  js  c++  java
  • UVa 120 煎饼

     https://vjudge.net/problem/UVA-120

    题意:颠倒连续子序列,使之成为升序。

    思路:按照从大到小的顺序,依次选择出一个数字进行分析:

            ①如果该数字已经在正确的位置上,则不用管。

            ②如果该数字已经在最顶端,则从它该在的位置一直到顶端颠倒。

            ③如果该数字不在最顶端,则应先把它搞到最顶端,再从它该在的位置一直到顶端颠倒。

     1 #include<iostream>  
     2 #include<algorithm>
     3 #include<string>
     4 #include<cstring>
     5 #include<sstream>
     6 using namespace std;
     7 
     8 const int maxn = 35;
     9 int ans[maxn];
    10 int coo[maxn];
    11 int coo2[maxn];
    12 int path[1000];
    13 int k;
    14 int num;
    15 
    16 string line;
    17 
    18 bool cmp(int a, int b)
    19 {
    20     return a > b;
    21 }
    22 
    23 void convert(int t)   //颠倒连续子序列
    24 {
    25     memcpy(coo2, ans, sizeof(ans));
    26     for (int i = 1; i <= t; i++)
    27     {
    28         ans[i] = coo2[t - i + 1];  
    29     }
    30 }
    31 
    32 void solve()
    33 {
    34     memcpy(coo, ans, sizeof(ans));
    35     num = 0;
    36     sort(coo + 1, coo + k + 1, cmp);
    37     for (int i = 1; i <= k; i++)
    38     {
    39         int s = coo[i];
    40         if (ans[k-i+1] == s) continue;  //如果已经在正确的位置上
    41         for (int j = 1; j <= k; j++)
    42         {
    43             if (ans[j] == s)
    44             {
    45                 if (j != 1)  //如果未在顶端,先将它颠倒至顶端
    46                 {
    47                     convert(j);   
    48                     path[num++] = k - j + 1; 
    49                 }
    50                 break;
    51             }
    52         }
    53         convert(k - i + 1);  //颠倒至正确位置
    54         path[num++] = i ;
    55     }
    56     path[num++] = 0;
    57 }
    58 
    59 int main()
    60 {
    61     //freopen("D:\txt.txt", "r", stdin);
    62     while (getline(cin,line    ))
    63     {
    64         k = 0;
    65         int x;
    66         stringstream ss(line);
    67         while (ss >> x)  ans[++k] = x;
    68         for (int i = 1; i <  k; i++)
    69             cout << ans[i] << " ";
    70         cout << ans[k] << endl;
    71         solve();
    72         for (int i = 0; i < num - 1; i++)
    73             cout << path[i] << " ";
    74         cout << path[num - 1] << endl;
    75     }
    76     return 0;
    77 }
  • 相关阅读:
    初试ASP.NET Web API/MVC API(附Demo)
    IP网络,光网络以及轨道交通的快速卸载随想
    解决Cocos2d-x3.0、3.1 &quot;_opendir$INODE64&quot;symbol(s) not found错误
    C strlen vs sizeof
    xUtils工具实现下载功能
    使用 PHPMailer 发送邮件
    自己定义TextView 调用ttf格式字体
    POJ
    C#实现麦克风採集与播放
    用程序来控制一个网页,实现自己主动输入等操作
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6352108.html
Copyright © 2011-2022 走看看