比赛地址:
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坐标同样处理,最后统计有多少点可以被看见。