zoukankan      html  css  js  c++  java
  • poj 3617

    https://vjudge.net/problem/POJ-3617

    问题描述

    给定长度为N的字符串S,要构造一个长度为N的字符串T,起初T是一个空串,随后反复进行下列任意操作:

    1.从S头部删一个字符加到T尾部

    2.从S尾部删一个字符加到T尾部

    构造出字典序尽量小的T

    思路:

    贪心。

    前面后面比较,取小的字符放到新串前面。如果相同,就两边同时往中间靠,比较下一个字符。可以设一个位移变量控制。

    坑。。点:一行最多80个字符

    有一种情况,最后80个字符后面,输出两个回车,会ac,加一个判断,输出一个回车,也会ac。

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int N;
    char s[2003];
    void solve()
    {
        int cnt = 0,f = 0;
        int a = 0;
        int b = N - 1;
        //cout << a << b;
        while(a <= b){
            //f = 0;
            bool left = false;
            ///设置一个偏移量 i
            for(int i = 0 ; a + i <= b;i++){
                if(s[a + i] < s[b - i]){
                    left = true;
                    break;
                }else if(s[a + i] > s[b - i]){
                    left = false;
                    break;
                }
            }
          //  cout << "hello" << endl;
            if(left)    putchar(s[a++]);
            else    putchar(s[b--]);
            cnt++;
            if(cnt == 80){
          //      f = 1;
                cout << endl;
                cnt = 0;
            }
        }
        //if(!f)
            putchar('
    ');
    }
    int main()
    {
        cin >> N;
        //cout << N;
        int i = 0;
        for(int i = 0 ; i < N;i++){
            cin >> s[i];
        }
      //  cout << s;
        solve();
        return 0;
    }
    View Code
    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int N;
    char s[2003];
    void solve()
    {
        int cnt = 0,f = 0;
        int a = 0;
        int b = N - 1;
        //cout << a << b;
        while(a <= b){
            f = 0;
            bool left = false;
            ///设置一个偏移量 i
            for(int i = 0 ; a + i <= b;i++){
                if(s[a + i] < s[b - i]){
                    left = true;
                    break;
                }else if(s[a + i] > s[b - i]){
                    left = false;
                    break;
                }
            }
          //  cout << "hello" << endl;
            if(left)    putchar(s[a++]);
            else    putchar(s[b--]);
            cnt++;
            if(cnt == 80){
                f = 1;
                cout << endl;
                cnt = 0;
            }
        }
        if(!f)
            putchar('
    ');
    }
    int main()
    {
        cin >> N;
        //cout << N;
        int i = 0;
        for(int i = 0 ; i < N;i++){
            cin >> s[i];
        }
      //  cout << s;
        solve();
        return 0;
    }
    View Code
  • 相关阅读:
    导弹拦截版
    [USACO1.5]数字三角形 Number Triangles
    FBI树
    修复公路
    台阶问题
    阶乘问题
    连续自然数和
    又是毕业季I
    生活大爆炸版石头剪刀布
    曹冲养猪
  • 原文地址:https://www.cnblogs.com/gudygudy/p/8976241.html
Copyright © 2011-2022 走看看