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('\n');
}
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('\n');
}
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

猜你喜欢

转载自www.cnblogs.com/zhibin123/p/8976241.html