海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛
分子
题目大意
在遥远的斯卡布罗集市,有机分子只能由 C , H , O C, H, O C,H,O 三种元素组成。根据珂学家们的探测,一个 C 原子的式量为 13 ,一个 H H H 原子的式量为 1 ,一个 O O O 原子的式量为 17 。一个有机分子的式量恰为各个原子的式量的总和。
对于有机分子式给出如下定义:
有机分子式只可能包含数字、括号和 C , H , O C, H, O C,H,O 三种元素标记;
数字只能出现在元素标记或右括号的右边,代表该元素(或括号内的分子式)重复出现的次数;
数字只可以是不包含前导零的正整数;
如果一个元素右侧没有数字,那么表示该元素只出现一次;
括号内包含非空的有机分子式,但该有机分子式不再嵌套括号。
例如 ( H H ) 3 H ( H ) 、 C O 2 、 C H 12 、 C H H O O (HH)3H(H)、CO2、CH12、CHHOO (HH)3H(H)、CO2、CH12、CHHOO 都是合法的有机分子式。
而 4 H C 4HC 4HC、 C H T H O L L O Y CHTHOLLOY CHTHOLLOY、 C H 3 ( C H 2 ) 3 ( C H ( C H C H 3 ) 2 C H 3 ) 2 ( C H 2 ) 3 C H 3 CH3(CH2)3(CH(CHCH3)2CH3)2(CH2)3CH3 CH3(CH2)3(CH(CHCH3)2CH3)2(CH2)3CH3 都不是合法的有机分子式。
对于符合上述要求的分子式,你能帮助珂学家们计算它的分子式量吗?
输入格式
输入仅一行,包含一个字符串,代表分子式。
保证符合上述定义,字符串中不含除 C , H , O C, H ,O C,H,O,括号和数字以外的字符,且长度不超过 1 0 5 10^5 105 。
输出描述
在一行中输出一个整数,代表该分子的式量。
保证答案不超过 1 0 15 10^{15} 1015。
备注
斯卡布罗集市是一个魔法集市,所以对化学的定义可能和麻瓜世界略有不同。
在第二个样例中,一共出现了 12 个 C C C 和 26 H H H;
在第三个样例中出现了 4 个 C C C、10 个 H H H 和 1 个 O O O。
根据官方题解,这个数据有括号嵌套,用STL中的 s t a c k stack stack 即可,傻逼的我看了题然后按照没有括号嵌套的情况写的只过了 76.9 % 76.9\% 76.9% 的数据。
#include <iostream>
#include <string>
#include <stack>
using namespace std;
typedef long long ll;
string s;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
cin>>s;
stack<ll>st;
int len=s.size();
for(int i=0;i<len;i++)
{
if(s[i]=='C') st.push(13);
else if(s[i]=='H') st.push(1);
else if(s[i]=='O') st.push(17);
else if(s[i]=='(') st.push(0);
else if(s[i]==')'){
ll t=0;
while(1){
if(!st.empty() && st.top())
t+=st.top(),st.pop();
else{
st.push(t);
break;
}
}
}
else{
ll t=0;
while(s[i+1]>='0'&&s[i+1]<='9')
t=(t+s[i]-'0')*10,i++;
t+=s[i]-'0';
t*=st.top();
st.pop();
st.push(t);
}
}
ll ans=0;
while(!st.empty())
ans+=st.top(),st.pop();
cout<<ans<<endl;
return 0;
}
爵士
题目大意
S a b i t Sabit Sabit 爵士是一名高贵的贵族,看遍了人世繁华,他变得热爱异世界文化。
他喜欢在 Q Q QQ QQ 群里和他的小伙伴们聊点二次元文化。可经常他们的话有些偏离二次元,这让 S a b i t Sabit Sabit 很苦恼。
我们认为,假如一句话里含有 2 ,那么这句话很二次元。
同时,群里的二次元浓度由二次元话的数量的占比决定。
现在爵士 S a b i t Sabit Sabit 给你看了一眼群里的聊天记录,希望可以知道群里的二次元浓度是多少。
输入格式
第一行输入一个整数 T ( 1 ≤ T ≤ 100 ) T (1\leq T\leq 100) T(1≤T≤100),表示数据的组数。对于每组数据:
第一行输入一个整数 n ( 1 ≤ n ≤ 200 ) n (1\leq n\leq 200) n(1≤n≤200),表示聊天记录的条数。
接下来 n n n 行每一行输入一个长度不超过 100 100 100 的字符串。保证不包含大写字母、小写字母、数字和空格以外的字符,并且没有连续的空格,行末不含空格
输出格式
对于每组数据,在一行中输出一个数字表示群里的二次元浓度。
如果你的答案的相对或绝对误差小于 1 0 − 4 10^{-4} 10−4
,那么它会被认为是正确的。即如果你的答案是 a a a 而标准答案为 b,那么你的答案将被认为是正确的当且仅当 ∣ a − b ∣ m a x ( 1 , ∣ b ∣ ) ≤ 1 0 − 4 \frac{|a-b|}{max(1,|b|)}\leq 10^{-4} max(1,∣b∣)∣a−b∣≤10−4
#include <iostream>
#include <string>
#include <cstdio>
#include <iomanip>
using namespace std;
typedef long long ll;
int main()
{
int t,n;
cin>>t;
string s;
while(t--)
{
double cnt=0;
cin>>n;
getchar();
for(int i=0;i<n;i++)
{
getline(cin,s);
int ok=0;
for(int j=0;j<s.size();j++)
if(s[j]=='2') ok=1;
if(ok) cnt++;
}
double t=(double)n;
cout<<setiosflags(ios::fixed)<<setprecision(10)<<cnt/t<<'\n';
}
return 0;
}
签到题,我用了一下 ios::sync_with_false(0) 过后 g e t l i n ( c i n , s ) getlin(cin,s) getlin(cin,s)无法读入空格,玄学orz,知识盲点,下来查查资料。
import java.util.Scanner;
public class Main {
public static<