第一次参加华为编程大赛的最后一题,现在回过来看了一下,发现要做完要3个多小时,比赛时间才3小时,还是要加紧练习。另外,答案也不知道是不是所有用例都能测试通过,就是捣腾了一下。。。。见笑。
2.3 题目:判断给定数是否满足给定条件要求
2.3.1 题目描述:
说明:
1、 条件是一个字符串,其格式由数学上的“开闭区间”,"&&"和"||"组成。其格式为:[5,7]&&(6,9]||(10,20),该条件表示“大于等于5,小于等于7”并且“大于6,小于9”或者“大于10,小于20”。
2、 &&优先级高于||。
2.3.2 输入:
1、 字符串1:上述描述格式的条件:如[5,7]&&(6,9]||(10,20)
2、 数字:判断是否满足条件的数字:9
说明:上诉两个参数是在一行中输入的,其格式为:字符串1+空格+数字。如[1,2]||(3,4) 3
2.3.3 输出:
如果满足条件,则输出1,否则0。
2.3.4 样例输入:
[1,2]||(3,4] 3
2.3.5 样例输出:
0
代码:
#include <cstdio> #include <stack> #include <cstdlib> #include <ctype.h> using namespace std; #define MAXN 100 stack<char> s; stack<char> v; int main() { //freopen("in.txt","r",stdin); char buf[MAXN]; char num[32],ch[32],a; memset(num,32*sizeof(char),'0'); int b,flag; int i,j,ok,value; while(2 == scanf("%s%s",&buf,&ch)) { sscanf(ch,"%d",&value); for(i=0;i<=strlen(buf);i++) { if( (i<strlen(buf)) ? (buf[i] != '|') : (i != strlen(buf)) ) { if(isdigit(buf[i]) || buf[i] == ',') v.push(buf[i]); else if(buf[i] == '&') { v.push(','); i++; } else s.push(buf[i]); //printf("%c\n",s.top()); } else { i++; while(!s.empty() && !v.empty()) { j=31; while(!v.empty() && v.top() != ',') { num[j--] = v.top(); v.pop(); } if(!v.empty() && v.top() == ',') v.pop(); sscanf(num,"%d",&b); a = s.top(); s.pop(); ok = 1; if(a == ']') { if(value > b) { ok = 0; break; } } else if(a == ')') { if(value >= b) { ok = 0; break; } } else if(a == '[') { if(value < b) { ok = 0; break; } } else if(a == '(') { if(value <= b) { ok = 0; break; } } else { if(!s.empty()) s.pop(); } } if(ok) { flag = 1;; break; } else { while(!s.empty()) s.pop(); while(!v.empty()) v.pop(); flag = 0; } } } printf("%d\n",flag); } return 0; }
思想很简单,就是一直读入字符串,读到“||”时就判断该数是否匹配栈内剩余的区间,如果匹配则直接返回1,否则继续读入以后的区间直到数据读完位置。