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",&n,&t);
    while (cin>>c)
    {
        if (c==‘ ‘||c==‘\n‘)    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==‘\n‘)
        {
            last=1;
            if(c==‘\n‘)    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;
} 
时间: 2024-08-02 03:24:23

P2614 计算器弹琴的相关文章

洛谷 P2614 计算器弹琴

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

【自动化__GUI自动化】__java__Windows应用程序识别__计算器

一.代码如下 package www.woniu.gui.one; import java.awt.AWTException; import java.awt.Robot; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.aw

bzoj2242: [SDOI2011]计算器.

2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 4353  Solved: 1679[Submit][Status][Discuss] Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数. In

j2ee-JSP之简单计算器

来源韩顺平.j2ee视频实战教程jsp第1讲(下集) -------------------------------------------------------------------------------------------------------- 简单计算器,可以控制输入的数(仅第一个数)不能为空且不能为字符串 myCal.jsp代码 1 <!--这是计算器的界面 --> 2 <!-- 可以控制输入的数不能为空且不能为字符串 --> 3 <%@ page co

通过键盘接收数值和字符,实现计算器功能。

import java.util.Scanner; /** * @author 蓝色以太 * 通过键盘接收数值和字符,实现计算器功能. */ public class Calculator { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入第一个数值:"); double num1=sc.nextDouble(); System.out

Android计算器APP练习(1)--- 界面

Android Studio 2.3.2 .参考文章:http://blog.csdn.net/like_program/article/details/51813632 1. 新建工程 MyCalculator,一路下一步,均采用默认值. 2. 按照要求修改三个xml文件内容.很多地方工程名字不一样,改成自己的名字. 3. 按照步骤修改Activity_main.XML文件,遇到问题: android:singleLine="false" 过时 暂时处理方式:删掉此行. 4. 按照步

一个简单的税利计算器(网页版)

嗯嗯,做一个简单的网页版的税率计算器,功能比较简单,但是相对比较实用.因为参考了一些其他作品,所以在计算汇率的时候习惯性的是以美元做单位.具体的功能有着较为详细的标注.仅供大家学习参考下. <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>JavaScript Loan Calculator</title>

反转波兰计算器

#include <iostream>using namespace std;typedef double stackEntry; const int overflow = 1;const int underflow = 2;const int success = 0; const int maxstack = 100;//栈的最大尺寸class stack{public: stack(); int pop(); int push(const stackEntry &item); in

JAVA编写的简单计算器

package com.hellojava.practice.test; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; impo