ACM ICPC Asia Regional 2011 Kuala Lumpur(马来西亚吉隆坡) [7月16日暑假集训]

比赛地址:

http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=9589#overview

A .Smooth Visualization  [签到题]

  直接模拟,注意下数只有一位的情况。

C .Equivalence  [表达式求值/后缀表达式]

  给定两个表达式,含有数字、字符(‘a’~‘z’、‘A’~‘Z’)、+-*和括号()以及其他字符(其他字符如空格、tab等不处理),判断是否等价。

  首先把中缀表达式转换成后缀表达式,再对后缀表达式求值。字符代如具体的值,如果值不同,则表达式不相等,如果相同则可能相同。可以多测几组值,如果值都相同则可判定表达式相同。

  关于用后缀表达式求表达式的值:

  http://blog.csdn.net/daheiantian/article/details/6553713

  http://blog.csdn.net/niushuai666/article/details/6702964

  代码;

View Code
 1 //zzy2012,7,17AC
 2 //后缀表达式 带符号表达式比较是否相同(支持+、-、*和括号,字符和数字都是单字符)
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<iostream>
 6 
 7 using namespace std;
 8 char s1[100],s2[100],a1[100],a2[100],stack[100];
 9 int st[100],var[150];
10 
11 int trans(char s[100],char a[199],int lens,char stack[100]){
12     int top = 0,lena = 0;
13     for(int i=0; i<lens; i++){
14         if((s[i]>='0' && s[i]<='9') || (s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z'))
15             a[lena++] = s[i];
16         else if(s[i] == '+' || s[i] == '-'){
17             while(top>0 && stack[top-1]!='(')
18                 a[lena++] = stack[--top];
19             stack[top++] = s[i];
20         }
21         else if(s[i] == '*'){
22             while(top>0 && stack[top-1]!='(' && stack[top-1]!='+' && stack[top-1]!='-')
23                 a[lena++] = stack[--top];
24             stack[top++] = s[i];
25         }
26         else if(s[i]=='(')
27             stack[top++] = s[i];
28         else if(s[i]==')'){
29             while(stack[top-1]!='(')
30                 a[lena++] = stack[--top];
31             top--;
32         }
33     }
34     while(top>0)
35         a[lena++] = stack[--top];
36     return lena;
37 }
38 
39 int calcu(char a[100],int stack[100],int var[150],int lena){
40     int top = 0;
41     for(int i=0; i<lena; i++){
42         if(a[i]>='0' && a[i]<='9')
43             stack[top++] = a[i]-'0';
44         else if((a[i]>='A' && a[i]<='Z') || (a[i]>='a' && a[i]<='z'))
45             stack[top++] = var[a[i]];
46         else{
47             if(a[i] == '*')
48                 stack[top-2] = stack[top-2] * stack[top-1];
49             else if(a[i] == '+')
50                 stack[top-2] = stack[top-2] + stack[top-1];
51             else if(a[i] == '-')
52                 stack[top-2] = stack[top-2] - stack[top-1];
53             top--;
54         }
55     }
56     return stack[0];
57 }
58 
59 int main()
60 {
61     int T,lens1,lens2,lena1,lena2,v1,v2;
62     bool sign;
63     cin>>T;
64     gets(s1);
65     while(T--){
66         gets(s1);
67         gets(s2);
68         lens1 = strlen(s1);
69         lens2 = strlen(s2);
70         lena1 = trans(s1,a1,lens1,stack);
71         lena2 = trans(s2,a2,lens2,stack);
72         sign = true;
73         for(int i = 1; i<10 && sign == true; i++){
74             for(int j=0; j<150; j++)
75                 var[j] = (j-60) * i + 11;
76             v1 = calcu(a1,st,var,lena1);
77             v2 = calcu(a2,st,var,lena2);
78             if(v1!=v2) sign = false;
79         }
80         if(sign == false)
81             printf("NO\n");
82         else
83             printf("YES\n");
84     }
85     return 0;
86 }

 

D .Tree Inspections  [序列处理]

  先把树的位置按y坐标排序,水平路也按y坐标排序。在某两条路之间的点,判断其是否可以被看见,可以通过一个标记数组。x坐标同样处理,最后统计有多少点可以被看见。

posted on 2012-07-17 22:00  Lattexiaoyu  阅读(406)  评论(0编辑  收藏  举报

导航