zoukankan      html  css  js  c++  java
  • CF Easy Tape Programming(题意)

    B. Easy Tape Programming

    这是前几天CF比赛上的B题,应该不算一道难题,但是题意很难理解,至少我读了三遍都没理解,最后弄明白了也就知道怎么做了。现在来说说这道题的题意。

    有一个程序语言是由'<'、'>'、0~9这些字符组成的,而这个程序的执行规则是,有两个指针,一个CP指针指向某个字符,还有一个DP来决定CP指针向哪个方向移动,初始的时候CP指针指向最左边的字符,DP指针向右的,然后开始移动CP,当CP前一个指向的是数字的时候,那个数字自减一,如果这个数字减到了0,那么就把这个数字从字符串中删除,如果前一个指向的是'<'或'>'的话,那么就把它删除,也就是如果有几个'<','>'连续,只留下一个,但CP指针出了给定的范围就结束执行,给出q个查询,让你输出的是执行完每次查询后,0~9这10个数字出现了多少次。

    注意:是对CP指向的前一个字符进行操作,而且初始的方向是向右的,所以如果有一个306<<>4>04这样一个字符串,在CP指向第四个'<'是方向还是向右的。第一次错在了第六个样例上了。

    参考代码:

    View Code
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <stack>
    #define  N 105
    using namespace std ;
    
    int num[N] ;
    char str[N] , st[N] ;
    
    int main()
    {
        int n , q , pos , flag , dir , l , r , i ;
    
        while ( scanf ( "%d%d%s" , &n , &q , str ) != EOF )
        {
            while ( q-- )
            {
                memset( num , 0 , sizeof ( num )) ;
                memcpy( st ,str , sizeof ( str )) ;
                scanf ( "%d%d" , &l , &r ) ;
                l-- ; r-- ;
                flag = 0 ; pos = 0 ; dir = 1 ;
                for( i = l ; i >= l && i <= r ; i += dir )
                {
                    if ( st[i] >= '0' && st[i] <= '9' )
                    {
                        num[st[i]-'0']++ ;
                        if ( st[i] == '0' ) st[i] = 0 ;
                        else
                        st[i]-- ;
                        flag = 0 ;// dir = 1 ;
                    }
                    else if ( st[i] == '>' )
                    {
                        dir = 1 ;
                        if ( flag )
                        st[pos] = 0 ;
                        flag = 1 ; pos = i ;
                    }
                    else if ( st[i] == '<' )
                    {
                        dir = -1 ;
                        if ( flag )
                        st[pos] = 0 ;
                        flag = 1 ; pos = i ;
                    }
                }
                for ( i = 0 ; i <= 9 ; i++ )
                {
                    if ( i )
                    printf ( " %d" , num[i] ) ;
                    else
                    printf ( "%d" , num[i] ) ;
                }
                printf ( "\n" ) ;
            }
        }
        return 0 ;
    }
  • 相关阅读:
    了解Android_09之GridView(网格视图)
    了解Android_08之ListView(列表视图)
    了解Android_07之ImageView与使用glide第三方库加载网络图片
    了解Android_06之CheckBox
    了解Android_05之RadioButton
    了解Android_04之EditText标签
    了解Android_03之Button标签
    了解Android_02之TextView标签
    了解Android_01之HelloWorld
    02_vue本地应用(v-text,v-html,v-on,v-show,v-if,v-bind,v-for,v-model)
  • 原文地址:https://www.cnblogs.com/misty1/p/2759170.html
Copyright © 2011-2022 走看看