zoukankan      html  css  js  c++  java
  • HDU 6342 Expression in Memories(模拟)多校题解

    题意:给你一个规则,问你写的对不对。

    思路:规则大概概括为:不能出现前导零,符号两边必须是合法数字。我们先把所有问号改好,再去判断现在是否合法,这样判断比一边改一边判断容易想。

    下面的讲解问号只改为+或1...

    对于(null)0?,+0?,*0?一律只能改为+,否则必是前导零,其他情况问号改为1,判断情况的时候注意一下i的范围,比如i==0时,s[i - 1]越界。

    判断对错时对++,(null)+,+(null)符号两边没数字的判错,如果01前是null或者+*判错。

    给几个样例:

    0??0       0?0?0      01?+0      0?*0

    代码:

    #include<cstdio>
    #include<set>
    #include<stack>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const int maxn = 560+5;
    const int INF = 0x3f3f3f3f;
    char s[maxn];
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            int flag = 0;
            scanf("%s",s);
            int len = strlen(s);
            for(int i = 0;i < len;i++){
                if(s[i] == '?'){
                    if(i == 1 && s[i - 1] == '0')   //(null)0?
                        s[i] = '+';
                    else if(i >= 2 && s[i - 1] == '0' && (s[i - 2] == '+' || s[i - 2] == '*'))  //+0?,*0?
                        s[i] = '+';
                    else
                        s[i] = '1';
                }
            }
            for(int i = 0;i < len;i++){
                if(s[i] == '0' && (s[i + 1] >= '0' && s[i + 1] <= '9' && i < len - 1) && (i == 0 || (s[i - 1] < '0' || s[i - 1] > '9'))){
                    //01前是null或者+*
                    flag = 1;
                    break;
                }
                if((s[i] == '*' || s[i] == '+') && (s[i + 1] == '*' || s[i + 1] == '+') && i < len - 1){
                    //++
                    flag = 1;
                    break;
                }
                if(s[i] == '+' || s[i] == '*'){
                    if(i == 0 || i == len - 1){ //(null)+,+(null)
                        flag = 1;
                        break;
                    }
                    if(s[i - 1] < '0' || s[i - 1] > '9'){   //++
                        flag = 1;
                        break;
                    }
                    if(s[i + 1] < '0' || s[i + 1] > '9'){   //++
                        flag = 1;
                        break;
                    }
                }
            }
            if(flag) printf("IMPOSSIBLE
    ");
            else printf("%s
    ",s);
        }
        return 0;
    }
    
  • 相关阅读:
    二项式反演
    快速沃尔什变换
    springMVC的form标签
    springMVC的拦截器配置
    RESTful使用方法
    springMVC数据绑定
    使用spring框架自带的字符拦截器
    将idea中的项目上传至github
    springMVC的使用方式
    springMVC的概述
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9408729.html
Copyright © 2011-2022 走看看