2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛)整理合集


海高校程序设计竞赛暨第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)CO2CH12CHHOO 都是合法的有机分子式。

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(1T100),表示数据的组数。对于每组数据:

第一行输入一个整数 n ( 1 ≤ n ≤ 200 ) n (1\leq n\leq 200) n(1n200),表示聊天记录的条数。

接下来 n n n 行每一行输入一个长度不超过 100 100 100 的字符串。保证不包含大写字母、小写字母、数字和空格以外的字符,并且没有连续的空格,行末不含空格
输出格式
对于每组数据,在一行中输出一个数字表示群里的二次元浓度。

如果你的答案的相对或绝对误差小于 1 0 − 4 10^{-4} 104
,那么它会被认为是正确的。即如果你的答案是 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)ab104

#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<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸愉信奥

谢谢亲的支持,我会继续努力啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值