zoukankan      html  css  js  c++  java
  • DFS、栈、双向队列:CF264A- Escape from Stones

    题目:

    Squirrel Liss liv

    Escape from Stonesed in a forest peacefully, but unexpected trouble happens. Stones fall from a mountain. Initially Squirrel Liss occupies an interval [0, 1]. Next, n stones will fall and Liss will escape from the stones. The stones are numbered from 1 to n in order.
    The stones always fall to the center of Liss's interval. When Liss occupies the interval [k - d, k + d] and a stone falls to k, she will escape to the left or to the right. If she escapes to the left, her new interval will be [k - d, k]. If she escapes to the right, her new interval will be [k, k + d].
    You are given a string s of length n. If the i-th character of s is "l" or "r", when the i-th stone falls Liss will escape to the left or to the right, respectively. Find the sequence of stones' numbers from left to right after all the n stones falls.
    Input
    The input consists of only one line. The only line contains the string s (1 ≤ |s| ≤ 106). Each character in s will be either "l" or "r".
    Output
    Output n lines — on the i-th line you should print the i-th stone's number from the left.
    Example
    Input
    llrlr
    Output
    3
    5
    4
    2
    1
    Input
    rrlll
    Output
    1
    2
    5
    4
    3
    Input
    lrlrr
    Output
    2
    4
    5
    3
    1






    解题心得:

    1、刚开始看到这个题的时候挺蒙蔽的,第一想法就是使用暴力,但是毫无疑问的是暴力肯定会将精度丢失,即使骗数据过了也容易被Hack。其实这个题有很多的解法

    2、先说思路,题意上面说的很明白,当向左的时候最左方的一个是第一个r的前一个,最左方的r的是第一个r出现的时候,可以画一个图了解一下。

    3、做法很多,了解了思路之后很简单,直接贴代码:



    DFS:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6+10;
    char a[maxn];
    int n;
    void dfs(int step)
    {
        if(step == n)
            return;
        if(a[step] == 'l')
        {
            dfs(step+1);
            printf("%d ",step+1);
        }
        if(a[step] == 'r')
        {
            printf("%d ",step+1);
            dfs(step+1);
        }
    }
    int main()
    {
        while(scanf("%s",a)!=EOF)
        {
            n = strlen(a);
            dfs(0);
        }
    }
    


    栈:
    其实和dfs差不多只不过看起来没那么迷糊!
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6+10;
    char a[maxn];
    int main()
    {
        scanf("%s",a);
        int len = strlen(a);
        stack <int> s;
        for(int i=0; i<len; i++)
        {
            if(a[i] == 'l')
                s.push(i+1);
            else
                printf("%d ",i+1);
        }
        while(!s.empty())
        {
            printf("%d ",s.top());
            s.pop();
        }
        return 0;
    }


    双向队列:
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6+10;
    int k[maxn];
    char s[maxn];
    int main()
    {
        scanf("%s",s);
        {
            int len = strlen(s);
            int start = 0,End = len - 1;
            for(int i=0 ;i<len ;i++)
            {
                if(s[i] == 'l')
                {
                    k[start] = i+1;
                    start++;
                }
                if(s[i] == 'r')
                {
                    k[End] = i+1;
                    End--;
                }
            }
            for(int i=len-1;i>=0;i--)
                printf("%d ",k[i]);
        }
    }
    
    




  • 相关阅读:
    如何搭建企业级中台系统
    Linux上安装git
    Jenkins的CI持续集成
    docker安装jenkins
    在线思维导图网站
    K8s容器编排
    MySQL存储引擎
    tomcat8 进入不了Manager App 界面 403 Access Denied
    IdeaVim-常用操作
    Node.js 安装及环境配置之 Windows 篇
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107354.html
Copyright © 2011-2022 走看看