洛谷 P2614 计算器弹琴

Posted 一蓑烟雨任生平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 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<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,T,st,Length;
double ans;
string s;
int main(){
    cin>>n>>T;
    for(;cin>>s;st=0){
        Length=s.length();
        for(int i=0;i<Length;i++){
            switch(s[i])                            {
                case  :
                case \r:
                case \n:break;
                case (:st++;break;
                case ):st--;break;
                case .:ans+=pow(0.5,st+1);break;
                default:ans+=pow(0.5,st);
            }
        }
    }
    cout<<(int)ans*60/T<<endl;
    return 0;
}

 

以上是关于洛谷 P2614 计算器弹琴的主要内容,如果未能解决你的问题,请参考以下文章

会唱歌会弹琴,清华大学 AI 学生华智冰火了

Java基础の乱弹琴二:break关键字

哪为高手知道,VOS弹琴游戏下载地址?

弹琴吧

用导电颜料画乐器来“纸上弹琴”,Arduino新玩法

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销