挑战密室

时间限制: ms  |  内存限制: KB
难度: 描述
R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室。Dr. Kong必须尽快找到解锁密码逃离,否则几分钟之后,WTO密室即将爆炸。 Dr. Kong发现密室的墙上写了许多化学方程式中。化学方程式,也称为化学反应方程式,是用化学式表示物质化学反应的式子。化学方程式反映的是客观事实。因此书写化学方程式要遵守两个原则:一是必须以客观事实为基础;二是要遵守质量守恒定律。 化学方程式不仅表明了反应物、生成物和反应条件。同时,化学计量数代表了各反应物、生成物物质的量关系,通过相对分子质量或相对原子质量还可以表示各物质之间的质量关系,即各物质之间的质量比。对于气体反应物、生成物,还可以直接通过化学计量数得出体积比。例如:2NaOH+H2SO4=Na2SO4+2H2O 经过多次试探、推理,Dr. Kong发现密码是4位数字,就隐藏在化学方程式等号后的第一个分子中,其分子量就可能是密码(若分子量不足4位,前面加0)。 好在Dr. Kong还记得墙上各化学方程式用到的化学元素的原子量如下: 你能帮Dr. Kong尽快找到密码吗? 输入
第一行: K,表示有K个化学方程式;
接下来有K行,每行为一个化学方程式
输出
对于每个化学方程式输出一行:即密码。
样例输入 2C+O2=2CO
2NaOH+H2SO4=Na2SO4+2H2O
Ca2CO3+H2O=Ca2(OH)+CO2
样例输出 提示
≤K≤ ,化学方程式的长度不超过50, 所有原子,分子的数量不超过9.小括号最多一层.
来源
第八届河南省程序设计大赛

好吧  ,我承认  这个题  确实  没做成功   一直报错   也不知道是为啥.   反正也是醉了   下面先附上  错误的代码

 #include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std ;
int main()
{
double q,l,m,n,t,sum,w,r;
int i,e;
char a[];
scanf("%lf",&t);
while(t--)
{
w=m=;
scanf("%s",a);
l=strlen(a);
for(i=;i<l;i++)
{
if(a[i-]=='=')
{
break;
}
}
e=i;
for(sum=;i<l;i++)
{
if(a[i]=='+')
break;
if(a[e]-''>=&&a[e]-''<=)
{
r=q=;
while(a[i]-''>=&&a[i]-''<=)
{
r=r*pow(,q)+(a[i]-'');
q++;
if(!(a[i+]-''>=&&a[i+]-''<=))
break;
i++;
}
i++;
e=-;
}
q=n=;
if(!(a[i]-''>=&&a[i]-''<=)) //当 这次不是数字 越界的时候 也不是数字哦.
{
if(a[i]=='(')
{
i++;
while(a[i]=='('||a[i]!=')')
{
if(a[i]=='C'&&a[i+]!='a')
m+=;
else
if(a[i]=='H')
m+=;
else
if(a[i]=='O')
m+=;
else
if(a[i]=='N'&&a[i+]!='a')
m+=;
else
if(a[i]=='C'&&a[i+]=='l')
{
m+=;
i++;
}
else
if(a[i]=='S')
m+=;
else
if(a[i]=='A'&&a[i+]=='l')
{
m+=;
i++;
}
else
if(a[i]=='C'&&a[i+]=='a')
{
m+=;
i++;
}
else
if(a[i]=='Z'&&a[i+]=='n')
{
m+=;
i++;
}
else
if(a[i]=='N'&&a[i+]=='a')
{
m+=;
i++;
}
if(a[i]==')')
i++;
n=;
i++;
}
}
else
{ if(a[i]=='C'&&a[i+]!='a')
m+=;
else
if(a[i]=='H')
m+=;
else
if(a[i]=='O')
m+=;
else
if(a[i]=='N'&&a[i+]!='a')
m+=;
else
if(a[i]=='C'&&a[i+]=='l')
{
m+=;
i++;
}
else
if(a[i]=='S')
m+=;
else
if(a[i]=='A'&&a[i+]=='l')
{
m+=;
i++;
}
else
if(a[i]=='C'&&a[i+]=='a')
{
m+=;
i++;
}
else
if(a[i]=='Z'&&a[i+]=='n')
{
m+=;
i++;
}
else
if(a[i]=='N'&&a[i+]=='a')
{
m+=;
i++;
}
n=; ////用于处理 当这个化学元素没有后缀时的情况
}
}
if(a[i+]-''>=&&a[i+]-''<=) //有后缀时.
{
i++;
n=;
while(a[i]-''>=&&a[i]-''<=)
{
n=n*pow(,q)+(a[i]-'');
q++;
if(!(a[i+]-''>=&&a[i+]-''<=))
break;
i++;
}
}
sum=sum+m*n;
m=;
}
printf("%04.lf\n",r*sum);
r=;
}
return ;
}

比较失败     当一道题   有思路但是是在解决不出来的时候    就删掉  优化着  在写一次.

-----------------------------------------------------------下面附上正确代码----------------------------------

 #include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int i,m,n,t,l,q,w,e,sum,r;
char a[],b[];
scanf("%d",&t);
while(t--)
{
scanf("%s",a); //开始将需要的字符剥离出来
l=strlen(a);
bool OK =false;
memset(b,'\0',sizeof(b));
for(r=w=n=q=i=;i<l;i++)
{
if(a[i-]=='=')
OK=true;
if(OK&&a[i]=='+')
{
OK=false;
// b[r]='\0';
}
if(OK)
{
if(q!=) // 整理完数字 之后 就需要 转存字母了.
{
b[w++]=a[i];
continue; //防止 到 else 那里在此赋值 .
}
if(((a[i]-'')<=&&(a[i]-'')>=)&&(w==&&r==)) //如果第一个是数字的话........
{
while((a[i]-'')<=&&(a[i]-'')>=) //将数字 正整理一下
{
n=n*pow(,q)+(a[i]-'');
q++;
i++;
} //整理完毕之后
i--;
}
else //不是数字的话
{
n=;
b[r++]=a[i];
}
}
}
l=strlen(b);
for(sum=i=;i<l;i++)
{
q=e=;
if(!(b[i]-''>=&&b[i]-''<=)) //当 这次不是数字 越界的时候 也不是数字哦.
{
if(b[i]=='(')
{
i++;
m=;
while(b[i]!=')')
{
if(b[i]=='C'&&b[i]=='a')
{
m+=;
i++;
}
else
if(b[i]=='N'&&b[i+]=='a')
{
m+=;
i++;
}
else
if(b[i]=='Z'&&b[i+]=='n')
{
m+=;
i++;
}
else
if(b[i]=='A'&&b[i+]=='l')
{
m+=;
i++;
}
else
if(b[i]=='C'&&b[i+]=='l')
{
m+=;
i++;
}
else
if(b[i]=='C')
m+=;
else
if(b[i]=='H')
m+=;
else
if(b[i]=='O')
m+=;
else
if(b[i]=='N')
m+=;
else
if(b[i]=='S')
m+=;
i++;
}
}
else
if(b[i]=='C'&&b[i]=='a')
{
m=;
i++;
}
else
if(b[i]=='N'&&b[i+]=='a')
{
m=;
i++;
}
else
if(b[i]=='Z'&&b[i+]=='n')
{
m=;
i++;
}
else
if(b[i]=='A'&&b[i+]=='l')
{
m=;
i++;
}
else
if(b[i]=='C'&&b[i+]=='l')
{
m=;
i++;
}
else
if(b[i]=='C')
m=;
else
if(b[i]=='H')
m=;
else
if(b[i]=='O')
m=;
else
if(b[i]=='N')
m=;
else
if(b[i]=='S')
m=;
e=; //用于处理 当这个化学元素没有后缀时的情况
}
if(b[i+]-''>=&&b[i+]-''<=) //有后缀时.
{
i++;
e=;
while(b[i]-''>=&&b[i]-''<=)
{
e=e*pow(,q)+(b[i]-'');
q++;
if(!(b[i+]-''>=&&b[i+]-''<=))
break;
i++;
}
}
sum=sum+m*e;
}
printf("%04.0lf\n",double(n*sum));
}
return ;
}

------------------------下面附上 优化之后的  代码   并且   附上解析  -------教训总结--------------------------------

 #include <stdio.h>
#include <string.h>
char che[][]={"N","C","O","Cl","S","H","Al","Ca","Zn","Na"};
int val[]={,,,,,,,,,};
int tonum(char str[])
{
for(int i=;i<;i++)
if(strcmp(str,che[i])==)
return val[i];
}
int main()
{
int ncase;
char str[];
scanf("%d",&ncase);
while(ncase--)
{
memset(str,,sizeof(str));
scanf("%s",str);
bool flag=false;
int k=;
char word[];
memset(word,,sizeof(word));
for(int i=;i<strlen(str);i++)
{
if(flag&&str[i]=='+')
break;
if(str[i]=='=')
{
flag=true;
continue;
}
if(flag)
{
word[k++]=str[i];
}
}
char ch[];
int sum=,head=,star=,n;
if(word[]>=''&&word[]<='')
head=word[]-'',star=;
for(int i=star;i<k;i++)
{
memset(ch,,sizeof(ch));
n=;
if(word[i]=='(')
{
i++;
int temp=;
while(word[i]!=')'&&i<k)
{
memset(ch,,sizeof(ch));
if((word[i]>='A'&&word[i]<='Z')&&(word[i+]>='a'&&word[i+]<='z'))
{
if(word[i+]>=''&&word[i+]<='')
n=word[i+]-'';
ch[]=word[i];ch[]=word[i+];ch[]='\0';
i++;
temp+=n*tonum(ch);
}
else if((word[i]>='A'&&word[i]<='Z')&&!(word[i+]>='a'&&word[i+]<='z'))
{
if(word[i+]>=''&&word[i+]<='')
n=word[i+]-'';
ch[]=word[i];ch[]='\0';
temp+=n*tonum(ch);
}
i++;
}
if(word[i+]>=''&&word[i+]<='')
n=word[i+]-'';
sum+=n*temp;
}
else if((word[i]>='A'&&word[i]<='Z')&&(word[i+]>='a'&&word[i+]<='z'))
{
if(word[i+]>=''&&word[i+]<='')
n=word[i+]-'';
ch[]=word[i];ch[]=word[i+];ch[]='\0';
i++;
sum+=n*tonum(ch);
}
else if((word[i]>='A'&&word[i]<='Z')&&!(word[i+]>='a'&&word[i+]<='z'))
{
if(word[i+]>=''&&word[i+]<='')
n=word[i+]-'';
ch[]=word[i];ch[]='\0';
sum+=n*tonum(ch);
}
}
sum=sum*head;
printf("%04d\n",sum);
}
return ;
}

第八届河南省省赛 A.挑战密室的更多相关文章

  1. 第八届acm省赛 A挑战密室(模拟)

    10406: A.挑战密室 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 29  Solved: 10 [Submit][Status][Web Bo ...

  2. NYOJ--1236--挑战密室(第八届河南省程序设计大赛)

    挑战密室 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室.Dr. Kong必须尽快找到解锁密 ...

  3. 第八届河南省赛F.Distribution(水题)

    10411: F.Distribution Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 11  Solved: 8 [Submit][Status] ...

  4. 第八届河南省赛G.Interference Signal(dp)

    G.Interference Signal Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 35  Solved: 17 [Submit][Status ...

  5. 第八届河南省赛D.引水工程(kruthcra+prime)

    D.引水工程 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 118  Solved: 41 [Submit][Status][Web Board] D ...

  6. 第八届河南省赛C.最少换乘(最短路建图)

    C.最少换乘 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 94  Solved: 25 [Submit][Status][Web Board] De ...

  7. 第八届河南省赛B.最大岛屿(dfs)

    B.最大岛屿 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 30  Solved: 18 [Submit][Status][Web Board] De ...

  8. 河南省第八届ACM省赛---引水工程

    引水工程 时间限制:2000 ms  |  内存限制:65535 KB 难度: 描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工程,事 ...

  9. 第八届河南省程序设计大赛-B.最大岛屿0000110011000000

    最大岛屿                                                                                           时间限制: ...

随机推荐

  1. SPOJ 3267 D-query (可持久化线段树,区间重复元素个数)

    D-query Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair ...

  2. 刺激(codevs 1958)

    题目描述 Description saffah的一个朋友S酷爱滑雪,并且追求刺激(exitement,由于刺激过度导致拼写都缺了个字母),喜欢忽高忽低的感觉.现在S拿到了一张地图,试图制定一个最长路径 ...

  3. 【ZJOI2017 Round1后记】

    2017.4.1: NOIP+Round1综合成绩出来,标准分离续命线差了80分,果然还是联赛坑挖太大了…… 不管怎么说能续命的话还是要试一下的…… 发毒誓:Round2前不打手游,不看NGA,不看星 ...

  4. 【BZOJ4710】分特产(容斥原理,组合计数)

    题意:有m种特产,第i种有a[i]个 有n个同学分特产,要求: 1.恰好分完 2.每个人至少要分到一个 求方案数模10^9+7 n,m,a[i]<=1000 思路:WYZ作业 首先考虑对于每一种 ...

  5. CALayer之 customizing timing of an animation

    customizing timing of an animation Timing is an important part of animations, and with Core Animatio ...

  6. Java并发包——使用新的方式创建线程

    Java并发包——使用新的方式创建线程 摘要:本文主要学习了如何使用Java并发包中的类创建线程. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520/p/ ...

  7. 创建Filter步骤

    创建Filter步骤: 创建Filter处理类 必须实现javax.servlet.Filter,该接口有init()完成filter初始化,destroy()完成资源回收,doFilter()过滤 ...

  8. hdu4057 Rescue the Rabbit(AC自己主动机+DP)

    Rescue the Rabbit Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  9. 【剑指Offer学习】【面试题65:滑动窗体的最大值】

    题目:给定一个数组和滑动窗体的大小,请找出全部滑动窗体里的最大值. 举例说明 比如,假设输入数组{2,3,4,2,6,2,5,1}及滑动窗体的大小.那么一共存在6个滑动窗体,它们的最大值分别为{4,4 ...

  10. Chrome插件(扩展)

    [干货]Chrome插件(扩展)开发全攻略   写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均 ...