1月29日学习总结

今日我继续学习了栈的表示和实现

两个指针相减相当于这两个元素之间差几个元素

相减的条件是两个指针指向同一个数组

算法一

顺序栈的初始化

top指针和base指针指向零号位置

栈的类型为SqStack,名字叫S

用C语言方法分配空间

就是分配这个SElemype(类型)分配MAXSIZE个,并用动态分配函数malloc分配出来

并转化成SElemType类型的指针赋值给base

S.base指向了空间的首元素,0元素

如果非零就分配成功了,如果不是则结束运行

完整初始化步骤

算法补充

判断栈是否为空

求顺序栈的长度

清空顺序栈

if(S.base)为base存在

销毁顺序栈

这里是动态内存释放问题,s.base所释放的是申请的动态内存,变量不会消失,动态内存释放后s.base此时是有地址的(随机的)要让s.base=null才可以

算法2

顺序栈的入栈

要先判断栈是否已经栈满了

入栈操作对S进行操作,将元素e入栈

*S.top++=e;等价于 *S.top= *S.top++

今日题目练习

题目背景

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

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

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

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

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

题目描述

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

对于所有要求 (�,�)(i,j)

你需要满足要求:

  1. 此时 ��,�Ai,j​ 状态为 11。

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

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1复制

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

输出 #1复制

7

输入 #2复制

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

输出 #2复制

9

说明/提示

样例 1 解释

所有的音调都是由第二根弦产生的。首先按顺序按 88 1010 1212 (�����=3count=3)。然后释放第 1212 段(�����=4count=4)。最后,按下第 55 段,释放第 88 1010 段 (�����=7count=7)。

样例 2 解释

对于每个操作,分别需要 11 11 11 11 33 00 22 次手指运动。

数据规模及约定

按下或释放一段弦各计一次手指运动。弹弦不算手指的移动,而是一个弹吉他的动作。(指你不需要管他怎么弹的,只需要按就是啦,说不定他可以用超能力呀)

对于 100%100% 的数据 �≤5×105n≤5×105 ,2≤�≤3×1052≤P≤3×105

说明
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int a[7][300005];
int sum[7];
int n,p;
int x,y;
int count = 0;
 
int main()
{
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&x,&y);
        while(sum[x] >= 1 && a[x][sum[x]]>y)
        {
            sum[x]--;
            count++;
        }
        if(a[x][sum[x]]==y)continue;
        a[x][++sum[x]]=y;
        count++;
    }
    printf("%d",count);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值