Constraint Checker hiho一下第176周

来源:互联网 发布:个人发卡网源码授权 编辑:程序博客网 时间:2024/05/29 17:37

题意: 题目给出一组由小于号和小于等于号组成的表达式,表达式中可能有变量和数字。然后再给出几组对应的变量值,判断每一组给出的变量值是否符合表示式。

思路: 试想一下如果我们知道了所有变量的值,将其存下来,然后只需要对每个式子从左到右遍历判断一遍就得到结果了。存储数据时我的思路如下(拿样例举个例子):
式子: A < B <= E
num: -1 -1 -1 //用 num 数组来存现有的数字,如果是变量则存入 -1
alph: A B E //用 alph 数组来存入当前的变量是哪个字母
eql: false true false //为 true 表示当前位的数或变量应小于等于下一位的数

代码:

#include<cstdio>#include<cstring>#include<cstdlib>#include<stack>#include<queue>#include<utility>#include<vector>#include<cmath>#include<set>#include<map>#include<iostream>#include<algorithm>#include<sstream>using namespace std;typedef long long LL;int N, T;int num[25][1000];char alph[25][1000];bool eql[25][1000];int alphval[30];char str[1000];set<char> sset;void Solve(int row){    memset(num[row], 0, sizeof(num[row]));    memset(alph[row], 0, sizeof(alph[row]));    int len = strlen(str);    for(int i=0; i<len; i++){        if(str[i]>='A' && str[i]<='Z'){            num[row][++num[row][0]] = -1;            alph[row][num[row][0]] = str[i];            sset.insert(str[i]);        }        else if(str[i]>='0' && str[i]<='9'){            int sum = 0;            while(i<len && str[i]>='0' && str[i]<='9'){                sum *= 10;                sum += str[i]-'0';                i++;            }            i--;            num[row][++num[row][0]] = sum;        }        else if(str[i] == '<'){            if(str[i+1] == '='){                eql[row][num[row][0]] = true;                i++;            }            else{                eql[row][num[row][0]] = false;            }        }    }}bool Judge(){    for(int i=0; i<N; i++){        int fro;        for(int j=1; j<=num[i][0]; j++){            if(j == 1){                if(num[i][j] == -1){                    fro = alphval[alph[i][j]-'A'];                }                else{                    fro = num[i][j];                }            }            else{                int beh;                if(num[i][j] == -1){                    beh = alphval[alph[i][j]-'A'];                }                else{                    beh = num[i][j];                }                if(eql[i][j-1]){                    if(fro <= beh){                        fro = beh;                    }                    else{                        return false;                    }                }                else{                    if(fro < beh){                        fro = beh;                    }                    else{                        return false;                    }                }            }        }    }    return true;}int main(){    //freopen("in.txt", "r", stdin);    while(scanf("%d", &N) == 1){        sset.clear();        for(int i=0; i<N; i++){            scanf("%s", str);            Solve(i);        }        scanf("%d", &T);        getchar();        for(int i=0; i<T; i++){            char ch;            int tmp;            for(int j=0; j<sset.size(); j++){                scanf("%c%d", &ch, &tmp);                getchar();                alphval[ch-'A'] = tmp;            }            if(Judge()){                printf("Yes\n");            }            else{                printf("No\n");            }        }    }    return 0;}
原创粉丝点击