Vijos-P1062-迎春舞会之交谊舞

描述:
明显…交谊舞是两个人跳的,而且是一男一女-_-|||……
由于交谊舞之前的节目安排,所有表演者都要站成一排,这一排人的顺序满足两点。
1⃣️:对于一对舞伴,男生站在女生的左边。
2⃣️:任何一对舞伴之间,要么没有人,要么有若干对舞伴。
排得过于整齐导致那些要表演的人都没办法找到自己的舞伴,怎么办呢?
所幸的是,SDFZ的女生比男生聪明得多,他们知道自己左边有几个男生。现在就请你告诉这些女生,他们的舞伴距离她们多远(即包括那个男生,一共有多少男生夹在她们中间)。
格式
输入格式
第一行为一个数num,表示参与交谊舞的女生个数。
第二行是num行,从左到右表示这num个女生左边分别由多少个男生。
输出格式
一排n个数,行末无空格。表示n个女生与其舞伴的距离。

样例

输入:
6
4 5 6 6 6 6
输出:
1 1 1 4 5 6

当我看到这个题时,便想到了几天前写的完美匹配子串的题,几乎一模一样,(地址:http://blog.csdn.net/f_zyj/article/details/51050333),都是需要用到栈处理,只需要把括号换成人就可以了,谁知道仔细一看,还是有区别的,完美匹配子串的问题是有一串子串,要求求里面最长的完美子串,但是这道题是给了一条完美子串,求两两匹配的字符间的距离。所以这两大题虽然都是用到了栈,但是仍然稍有区别。准确说,除了使用的工具差不多,其他的区别挺大的。

这里,我想到的方法是,首先经过处理每一个女生左边男生数目的数据来进栈,(这个题我们不需要出栈)把所有的男生女生按顺序入栈,然后开始查找女生,找到女生后,就从女生的位置开始向前查找,找到的第一个男生且未被别的女生占有的男生即为舞伴,这里我们用tag表示该男生是否被女生占用。

思路比较清晰,但是这里面的栈函数要注意,很多细节问题都需要考虑,要根据自己的栈操作函数来对具体问题的边界进行处理。一开始我一直错,后来才发现是我的栈函数里面的边界和主函数中的不一致导致的。⚠️

代码C:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 200
#define OK 1
#define ERROR 0
#define Max(a, b) ((a > b) ? (a) : (b))
typedef int Status;
typedef char SElemType;
//栈结构
typedef struct
{
    int top;    //用于栈顶指针
    SElemType data[MAXSIZE];
    int tag[MAXSIZE];   //是否被女舞伴占用
} SqStack;
//Push
Status Push (SqStack *S, SElemType e)
{
    if (S->top == MAXSIZE - 1)  //栈满
    {
        return ERROR;
    }
    S->top++;   //栈顶指针加一
    S->data[S->top] = e;    //将新插入元素
    S->tag[S->top] = 1;
    return OK;
}
////Pop
//Status Pop (SqStack *S)
//{
// if (S->top == -1) //栈空
// {
// return ERROR;
// }
// S->top--;
// return OK;
//}

int main(int argc, const char * argv[])
{
    int sum = 0, i, j, k = 0;
    int num, women[100], man[100];
    SqStack *S = (SqStack*)malloc(sizeof(SqStack));
    scanf("%d", &num);
    //合并入栈
    for (i = 0; i < num; i++)
    {
        scanf("%d", &women[i]);
        for (; sum < women[i]; sum++)
        {
            Push(S, '(');     //用(表示男舞者
        }
        Push(S, ')');         //用)表示女舞者
    }
// for (i = 1; i < S->top; i++)
// {
// printf("%c ", S->data[i]);
// }
// printf("%c\n", S->data[S->top]);
    //查找男舞伴
    for (i = 2; i <= S->top; i++)
    {
        if (S->data[i] == ')')
        {
            for (j = i - 1; j > 0; j--)
            {
                if (S->data[j] == '(' && S->tag[j])
                {
                    S->tag[j] = 0;
                    man[k++] = (i - j + 1) / 2;
                    break;
                }
            }
        }
    }
    //输出距离
    for (i = 0; i < num - 1; i++)
    {
        printf("%d ", man[i]);
    }
    printf("%d\n", man[num - 1]);
    return 0;
}

最近我总是感觉自己很盲目,不知道该做些什么,也许是我的压力不到位导致的,所以,我要继续给自己施压了,数据结构虽然看了一遍,但是没有很好的应用,导致忘了很多,所以,尽量在去北京参加蓝桥杯A组国赛前,再看一遍,细化学习一下数据结构!五月中旬,数学建模;五月底,蓝桥杯国赛;六月初,acm省赛。事情真的很多,我不能再耽搁了,但是今天忽然感觉想找个女朋友了!!!天天窝在寝室敲代码效率真的不高,经常头昏脑胀的,不是个学习的样子,需要劳逸结合了…………………….

    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/f_zyj/article/details/51148328
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞