zoukankan      html  css  js  c++  java
  • P2614 计算器弹琴

    题目描述

    总所周知,计算器可以拿来干很多它本不应该干的事情,比如写作文。(参看洛谷P2549)

    小A发现了一个计算器的另一个隐藏功能——弹琴。

    http://www.bilibili.com/video/av2205500/

    如果按上一个键,比如说1,就会发出中音“Do”。

    这边给出按键音高表

    + 低音Fa
    < 低音So
    * 低音La
    / 低音Xi
    1 中音Do
    2 中音Re
    3 中音Mi
    4 中音Fa
    5 中音So
    6 中音La
    7 高音Xi
    8 高音Do
    9 高音Re
    = 高音Mi
    % 高音Fa
    C 高音So
    M 高音La

    现在小A搞到了一份乐谱——我们称为计算器谱,一种变形的简谱。

    时值(也就是按的时间长度)是这么记录的,例如:

    1 是四分音符,占1拍。

    1- 是二分音符,占2拍。

    1--- 是全音符,占四拍。

    对于小于四分音符的音符,我们用嵌套括号表示,例如

    (1(34(56))2)

    1和2在一层括号中,是八分音符,占0.5拍。

    3和4在两层括号中,是16分音符,占0.25拍。

    5和6在三层括号中,是32分音符,占1/8拍。当然实际上比较少见。

    括号中不会出现‘-’这个符号。

    不会出现四层或以上的括号。

    在一个音符后面添加一个附点即“.”表示这个音符延长1/2倍。

    例如 1-.是3拍,1.是1.5拍,(3.(45.))3是3/4拍,4是1/4拍,5是3/8拍。

    附点不会连续添加两个或以上,也不会出现超过四拍的音符。

    不考虑其他的乐理符号。

    另外整个乐谱会给一个速度,整数,意思是一分钟多少拍。

    为了美观,乐谱可以随便换行、添加空格。这个忽略即可。

    现在小A想知道,按完这个谱子,需要多少时间(单位:秒)

    输入输出格式

    输入格式:

    第一行,两个整数n,T,表示谱子行数以及速度(拍每分)

    接下来n行,给出乐谱。

    输出格式:

    一个整数,表示演奏需要花费的时间,单位秒,舍去小数部分。

    输入输出样例

    输入样例#1:
    2 60
    3345 5432 1123 322-
    3345 5432 1123 211-
    输出样例#1:
    32
    (一共32拍,每分钟60拍,所以是32秒。对了,这是欢乐颂的开头部分)
    输入样例#2:
    5 120
    3(1.(3))55 8(7.(6))65 655(3.(1)) (4.(4))32- 
    3(1.(2))35 8(7.(6))65 655(4.(3)) (2.(3))21- 
    2.(3)44 6(6.(6))(5.(4))3 3.(5)88 (9.(8)7.(6))5-
    =.(=)(9.(8))7 9.(8)(7.(6))5  8(856543) (2.(3))43- 
    =.(=)(9.(8))7 9.(8)(7.(6))5  8(857654) (3.(4))21- 
    输出样例#2:
    40
    (一共80拍,别问我怎么数的,一分钟120拍的话,是40秒。至于这是什么曲子?根据相关的法律政策,该部分未予显示。)

    说明

    http://bd.kuwo.cn/yinyue/4641527

    对于40%的数据,没有附点没有括号

    对于100%的数据,括号层数不会超过3层,不超过100行,每行不超过100个字符。

    对于其中的一个数据,是《千本樱》。

      

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    char c;
    int n,t; 
    int sta=0;
    int cnt=0,ans=0;
    int la=0,now=16;
    int main()
    {
        scanf("%d%d
    ",&n,&t);    
        while (cin>>c)
        {
            if (c==' '||c=='
    ')    now=16;    else        
               if (c=='(')    now/=2;     
            else if (c==')')        now*=2;        
            else if (c=='.')    cnt+=now/2;        
            else if (c=='-')
            {
                cnt+=now;
                la++;
            }else                cnt+=now;        
            }
        t*=16; 
        ans=cnt*60/t;
        cout<<ans;
        return 0;
    } 

    也许是因为精度,这个代码没过

    #include<iostream>
    #include<cstdio>
    #include<math.h>
    #include<algorithm>
    #include<queue>
    #include<string.h>
    using namespace std;
    int n,t,nn;
    char c;
    double tot,last=1;
    int main()
    {
        scanf("%d%d",&n,&t);
        scanf("%c",&c);
        for(int i=1;i<=10009;i++)
        {
            if(nn==n)    break;
            scanf("%c",&c);
            if(c>='0'&&c<='9')    
            {
                tot+=last;
                continue;
            }
            if(c==' '||c=='
    ')
            {
                last=1;
                if(c=='
    ')    nn++;
                continue;
                
            }
            if(c=='(')
            {
                last/=2;
                continue;
            }
            if(c==')')
            {
                last*=2;
                continue;
            }
            if(c=='.')    
            {
                tot+=last/2;
                continue;
            }
            if(c=='-')
            {
                tot++;last=1;
                continue;
                
            }
            tot+=last;
        }
        tot=(double)tot/(t/60);
        cout<<tot;
        return 0;
    } 
  • 相关阅读:
    黑客长期摇号不中"黑"掉北京小客车摇号网
    网络犯罪新动向:“黑客”学历不高 年龄不超30岁
    McAfee重返科技业 研制D-Central防政府监视
    windows系统服务编程代码示例分享
    Fireeye火眼公司发布报告,评论中国网络间谍活动
    FBI是如何破获“美国少女”裸照勒索案的
    得到内网域管理员的5种常见方法
    别人在用你的什么技术在赚钱.其实你天天在做
    慢一点恋爱,别急着洞房
    元芳,关于向朋友借钱你怎么看
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7327421.html
Copyright © 2011-2022 走看看