第八届河南省赛 zzuoj 10406: A.挑战密室 (模拟) 屌题
来源:互联网 发布:超星阅览器 mac 编辑:程序博客网 时间:2024/05/20 23:04
10406: A.挑战密室
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 20 Solved: 7
[Submit][Status][Web Board]
Description
R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室。Dr. Kong必须尽快找到解锁密码逃离,否则几分钟之后,WTO密室即将爆炸。
Dr. Kong发现密室的墙上写了许多化学方程式中。化学方程式,也称为化学反应方程式,是用化学式表示物质化学反应的式子。化学方程式反映的是客观事实。因此书写化学方程式要遵守两个原则:一是必须以客观事实为基础;二是要遵守质量守恒定律。
化学方程式不仅表明了反应物、生成物和反应条件。同时,化学计量数代表了各反应物、生成物物质的量关系,通过相对分子质量或相对原子质量还可以表示各物质之间的质量关系,即各物质之间的质量比。对于气体反应物、生成物,还可以直接通过化学计量数得出体积比。例如:2NaOH+H2SO4=Na2SO4+2H2O
经过多次试探、推理,Dr. Kong发现密码是4位数字,就隐藏在化学方程式等号后的第一个分子中,其分子量就可能是密码(若分子量不足4位,前面加0)。
好在Dr. Kong还记得墙上各化学方程式用到的化学元素的原子量如下:
N
C
O
Cl
S
H
Al
Ca
Zn
Na
14
12
16
35
32
2
27
40
65
23
你能帮Dr. Kong尽快找到密码吗?
Input
第一行: K 表示有K个化学方程式;
接下来有K行,每行为一个化学方程式
2≤K≤8 ,化学方程式的长度不超过50, 所有原子,分子的数量不超过9.小括号最多一层.
Output
对于每个化学方程式输出一行:即密码。
Sample Input
32C+O2=2CO2NaOH+H2SO4=Na2SO4+2H2OCa2CO3+H2O=Ca2(OH)2+CO2
Sample Output
005601420116
HINT
Source
第八届河南省赛
//刚开始少了个特判(0000),害我花了好长时间才找出来(T_T)。。。
AC代码:
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;char s[100];char ss[100];char sc[100];char c[100];char cc[2];int l,sum,q;int zh(char *s){ if(strcmp(s,"N")==0)return 14; else if(strcmp(s,"C")==0)return 12; else if(strcmp(s,"O")==0)return 16; else if(strcmp(s,"Cl")==0)return 35; else if(strcmp(s,"S")==0)return 32; else if(strcmp(s,"H")==0)return 2; else if(strcmp(s,"Al")==0)return 27; else if(strcmp(s,"Ca")==0)return 40; else if(strcmp(s,"Zn")==0)return 65; else if(strcmp(s,"Na")==0)return 23;}int solve(int p) { while(c[p]!='('&&p<l) { int t=0; while(isdigit(c[p])) t=t*10+c[p++]-'0'; if(t==0) t++; int x=-1; while(t--) { if(c[p]==')') x=solve(p+1); else { if(c[p-1]>='a'&&c[p-1]<='z') continue; if(c[p]>='a'&&c[p]<='z') { ss[q++]=c[p]; ss[q++]=c[p+1]; } else { ss[q++]=c[p]; } } } if(x!=-1) p=x; p++; } return p; } int judge(int bb,int ee){ for(int i=bb;i<ee;i++) { if(sc[i]>='A'&&sc[i]<='Z') { if(sc[i+1]>='A'&&sc[i+1]<='Z') { memset(cc,'\0',sizeof(cc)); cc[0]=sc[i]; sum+=zh(cc); } else { memset(cc,'\0',sizeof(cc)); cc[0]=sc[i]; cc[1]=sc[i+1]; sum+=zh(cc); } } } return sum;}int main(){ int t,i,j,k,flag; int b,e; scanf("%d",&t); getchar(); while(t--) { flag=0; memset(ss,'\0',sizeof(ss)); memset(sc,'\0',sizeof(sc)); memset(c,'\0',sizeof(c)); sum=0;flag=0; gets(s); l=strlen(s); for(i=0;i<l;i++) { if(s[i]=='=') { b=i+1; break; } }if(b==l)//这块是特判(0000),很重要。 e=b; else { for(i=b;i<l;i++) { if(s[i]=='+'||s[i]=='-') { e=i-1; break; } else if(i==l-1) { e=i; break; } } } k=0; for(i=e;i>=b;i--) { c[k++]=s[i]; } l=strlen(c); q=0; solve(0); int mm=0; for(i=q-1;i>=0;i--) { if((ss[i]>='A'&&ss[i]<='Z')||(ss[i]>='a'&&ss[i]<='z')) sc[mm++]=ss[i]; } int ll=strlen(sc);if(c[k-1]>='0'&&c[k-1]<='9') sum=(c[k-1]-'0')*judge(0,ll); else sum=judge(0,ll); printf("%04d\n",sum);} return 0;}
//这个是刚开始的WA代码,少了个特判。。。
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;char s[100];char ss[100];char sc[100];char c[100];char cc[2];int l,sum,q;int zh(char *s){if(strcmp(s,"N")==0)return 14;else if(strcmp(s,"C")==0)return 12;else if(strcmp(s,"O")==0)return 16;else if(strcmp(s,"Cl")==0)return 35;else if(strcmp(s,"S")==0)return 32;else if(strcmp(s,"H")==0)return 2;else if(strcmp(s,"Al")==0)return 27;else if(strcmp(s,"Ca")==0)return 40;else if(strcmp(s,"Zn")==0)return 65;else if(strcmp(s,"Na")==0)return 23;}int solve(int p) { while(c[p]!='('&&p<l) { int t=0; while(isdigit(c[p])) t=t*10+c[p++]-'0'; if(t==0) t++; int x=-1; while(t--) { if(c[p]==')') x=solve(p+1); else { if(c[p-1]>='a'&&c[p-1]<='z') continue;if(c[p]>='a'&&c[p]<='z'){ss[q++]=c[p];ss[q++]=c[p+1];}else{ss[q++]=c[p];}} } if(x!=-1) p=x; p++; } return p; } int judge(int bb,int ee){for(int i=bb;i<ee;i++){if(sc[i]>='A'&&sc[i]<='Z'){if(sc[i+1]>='A'&&sc[i+1]<='Z'){ memset(cc,'\0',sizeof(cc)); cc[0]=sc[i];sum+=zh(cc);}else //if(sc[i+1]>='a'&&sc[i+1]<='z'){memset(cc,'\0',sizeof(cc));cc[0]=sc[i];cc[1]=sc[i+1];sum+=zh(cc);}}}return sum;}int main(){int t,i,j,k;int b,e;scanf("%d",&t);getchar();while(t--){memset(ss,'\0',sizeof(ss));memset(sc,'\0',sizeof(sc));sum=0;gets(s);l=strlen(s);for(i=0;i<l;i++){if(s[i]=='='){b=i+1;break;}}for(i=b;i<l;i++){if(s[i]=='+'||s[i]=='-'){e=i-1;break;}else if(i==l-1){e=i;break;}}k=0;for(i=e;i>=b;i--){c[k++]=s[i];}l=strlen(c);q=0;solve(0);int mm=0;for(i=q-1;i>=0;i--){if((ss[i]>='A'&&ss[i]<='Z')||(ss[i]>='a'&&ss[i]<='z'))sc[mm++]=ss[i];}//printf("%s\n",sc);int ll=strlen(sc);//printf("%d\n",ll);if(c[k-1]>='0'&&c[k-1]<='9')sum=(c[k-1]-'0')*judge(0,ll);elsesum=judge(0,ll);if(sum<10000)printf("%04d\n",sum);elseprintf("%d\n",sum%10000);}return 0;}
0 0
- 第八届河南省赛 zzuoj 10406: A.挑战密室 (模拟) 屌题
- zzuoj 10406: A.挑战密室
- 第八届河南省程序设计大赛 挑战密室(化学式模拟)
- 河南省第八届ACM A.挑战密室 详细题解
- 挑战密室,第八届河南省省赛,郑大OJ10406
- nyoj 1236 挑战密室(河南省第八届acm程序设计大赛)
- 第八届河南省程序设计大赛-NYOJ-1236-挑战密室
- nyoj 1236 挑战密室 第八届河南省程序设计大赛
- 第八届河南省赛试题挑战密室表达式求值类_NYOJ1236
- 第八届河南省赛 zzuoj 10411: F.Distribution (模拟)水
- 问题 A: 挑战密室 河南省第九届省赛
- 第八届河南省赛 zzuoj 10407: B.最大岛屿
- nyoj 1236挑战密室 河南省第八届大学生程序设计大赛acm
- NYOJ1236 第八届acm省赛 A挑战密室
- nyoj 1236 挑战密室 河南省ACM2015年省赛A题
- NYOJ 挑战密室---1236第八届
- 第八届河南省赛 zzuoj 10409: D.引水工程 (最小生成树)
- 第八届河南省赛 zzuoj 10412: G.Interference Signal (DP&&贪心)
- HttpPost登陆
- 查看自己oracle的service_name
- java 枚举
- openssl制作证书全过程
- nginx+tomcat绑定域名配置记录
- 第八届河南省赛 zzuoj 10406: A.挑战密室 (模拟) 屌题
- 输入流转换成字符串
- iOS UITableView(六) cell的移动
- 使用openssl进行证书格式转换
- 阅读app
- javamail使用IMAP协议收取gmail邮件
- Swift原生JSON解析和第三方解析对比
- IllegalStateException
- CSS padding margin border属性和布局