[COCI2010-2011#7] GITARA(2.2)

题目背景

Darko 有一个想象的外星朋友,他有十亿根手指。外星人快速拿起吉他,在网上找到一段简单的旋律并开始弹奏。

这个吉他像寻常一样有六根弦,令其用 1 到 6 表示。每根弦被分成 P 段,令其用 1 到 P 表示。

旋律是一串的音调,每一个音调都是由按下特定的一根弦上的一段而产生的(如按第 4 弦第 8 段)。如果在一根弦上同时按在几段上,产生的音调是段数最大的那一段所能产生的音调。

例:对于第 3 根弦,第 5 段已经被按,若你要弹出第 7 段对应音调,只需把按住第 7 段,而不需放开第 5 段,因为只有最后的一段才会影响该弦产生的音调(在这个例子中是第 7 段)。类似,如果现在你要弹出第 2 段对应音调,你必须把第 5 段和第 7 段都释放。

请你编写一个程序,计算外星人在弹出给定的旋律情况下,手指运动的最小次数。

题目描述

你有一个 6×P 的矩阵 A,初始状态皆为 0。

对于所有要求 (i,j)

你需要满足要求:

  1. 此时 Ai,j 状态为 1。

  2. 对于 Ai,j+k(k>0) 状态为 0。

你在满足要求的情况下需要求状态转换最小次数。

输入格式

第一行包含两个正整数 n ,P。它们分别指旋律中音调的数量及每根弦的段数。

下面的 n 行每行两个正整数 i ,j,分别表示能弹出对应音调的位置——弦号和段号,其为外星人弹奏的顺序。

输出格式

一个非负整数表示外星人手指运动次数最小值。

样例 #1

样例输入 #1

5 15
2 8
2 10
2 12
2 10
2 5

样例输出 #1

7

样例 #2

样例输入 #2

7 15
1 5
2 3
2 5
2 7
2 4
1 5
1 3

样例输出 #2

9
#include<bits/stdc++.h>
using namespace std;
stack<int> s[10];
int n,p,ans;
int main(){
    cin>>n>>p;
    while(n--)
    {
        int x,y;
        cin>>x>>y;
        if(s[x].empty()){
            ans++;
            s[x].push(y);
        }
        else if(y>s[x].top())
        {
            ans++;
            s[x].push(y);
        }
        else{
            while(y<s[x].top())
            {
                ans++;
                s[x].pop();
                if(s[x].empty())
                    break;
            }
            if(s[x].empty()){
                ans++;
                s[x].push(y);
            }    else if(y>s[x].top()){
                ans++;
                s[x].push(y);
            }
            
        }
    }
    cout<<ans;
    return 0;
}

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值