【洛谷P6704 GITARA】题解

本文介绍了一道关于外星人弹奏音乐旋律的问题,并通过使用单调栈算法来计算外星人在演奏过程中手指最少需要移动的次数。文章提供了一个具体的编程实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际上是一道单调栈的简单题

题目背景 Darko 有一个想象的外星朋友,他有十亿根手指。外星人快速拿起吉他,在网上找到一段简单的旋律并开始弹奏。
这个吉他像寻常一样有六根弦,令其用 111666 表示。每根弦被分成 PPP 段,令其用 111 到 PPP 表示。
旋律是一串的音调,每一个音调都是由按下特定的一根弦上的一段而产生的(如按第 444 弦第 888 段)。如果在一根弦上同时按在几段上,产生的音调是段数最大的那一段所能产生的音调。
例:对于第 333 根弦,第 555 段已经被按,若你要弹出第 777 段对应音调,只需把按住第 777 段,而不需放开第 555 段,因为只有最后的一段才会影响该弦产生的音调(在这个例子中是第 777)。类似,如果现在你要弹出第 222 段对应音调,你必须把第 555 段和第 777 段都释放。
请你编写一个程序,计算外星人在弹出给定的旋律情况下,手指运动的最小次数。
题目描述 你有一个 6×P6 \times P6×P 的矩阵 AAA,初始状态皆为 000。
对于所有要求 (i,j)(i,j)(i,j)
你需要满足要求:


此时 Ai,jA_{i,j}Ai,j​ 状态为 111。


对于 Ai,j+k(k>0)A_{i,j+k} (k>0)Ai,j+k​(k>0) 状态为 000。


你在满足要求的情况下需要求状态转换最小次数。
输入格式 第一行包含两个正整数 nnn ,PPP。它们分别指旋律中音调的数量及每根弦的段数。
下面的 nnn 行每行两个正整数 iii ,jjj,分别表示能弹出对应音调的位置——弦号和段号,其为外星人弹奏的顺序。
 输出格式 一个非负整数表示外星人手指运动次数最小值。

代码如下:

#include<iostream>
#include<stack>
using namespace std;
int main()
{
 //六根弦 sx[1]~sx[6]
 stack<int> sx[7];
 
 int n,P;cin>>n>>P;//P实际没有用到
 
 //sum记录次数
 int sum;
 
 for(int i=1;i<=n;i++)
 {
  int a,b;
  cin>>a>>b;
  
  //如果栈中有值(a弦被按住) 且位于b段上面 则移除栈顶(松开手) 直到没有按住比b段高的位置
  while(!sx[a].empty()&&sx[a].top()>b)
  {
   sx[a].pop();
   sum++;
  }
 
  if(!sx[a].empty()&&sx[a].top()==b) continue;
  sx[a].push(b);
  sum++;
 }
 
 cout<<sum;
 return 0} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值