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

来源:互联网 发布:西数和希捷哪个好 知乎 编辑:程序博客网 时间:2024/04/29 13:49

描述:
明显…交谊舞是两个人跳的,而且是一男一女-_-|||……
由于交谊舞之前的节目安排,所有表演者都要站成一排,这一排人的顺序满足两点。
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;//PushStatus 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省赛。事情真的很多,我不能再耽搁了,但是今天忽然感觉想找个女朋友了!!!天天窝在寝室敲代码效率真的不高,经常头昏脑胀的,不是个学习的样子,需要劳逸结合了…………………….

0 0