[Vijos]P1062 迎春舞会之交谊舞

->传送门

题目

背景

HNSDFZ的同学们为了庆祝春节,准备排练一场舞会。

描述

明显……交谊舞是2个人跳的,而且一男一女 -__-||||。

由于交谊舞之前的节目安排,所有的表演者都站成了一排。这一排人的顺序满足2点:

①对于一对舞伴男生站在女生的左边。

②任何一对舞伴之间,要么没有人,要么就有若干对舞伴。

排得过于整齐导致那些要表演交谊舞的人都没办法看到自己的舞伴,怎么办类…….

所幸的是,SDFZ的女生比男生聪明得多。她们知道自己左边有几个男生。

现在就请你再告诉这些女生,她们的舞伴距离她们多远(即包括那个男生,一共有多少男生夹在他们之间)。

格式

输入格式

第一行为一个数n,表示参与跳交谊舞的女生个数。

第二行n个数,从左到右表示这n个女生左边分别有多少个男生。

输出格式

一排n个数,行末无空格。表示n个女生与其舞伴的距离。

样例1

样例输入1

6
4 5 6 6 6 6

样例输出1

1 1 1 4 5 6

限制

各个测试点1s

提示

n<=1500

结果小于2^31-1

题解

真心给出题人的语文水平跪了……

这道题看起来就很像括号匹配那样栈的题目,我也没想出什么比较高效的方法,就按照那个思路,用了一个不太标准的栈写的这道题.

我的想法是将每个女生离她舞伴的距离存在那个舞伴的上面,距离初始为1,这样每个女生找到栈顶元素作为舞伴,距离就是舞伴所带的权值,然后将其出栈,每次出栈的时候,就将舞伴前面的所有元素+1.

我语文好像更差啊,诸位还是看代码吧.

顺便吐槽一下这个数组大小的问题,这数据……

#include
using namespace std;
const int maxn = 10000;
int n, cur =0, p = 0, s[maxn];
int main()
{
  scanf("%d",&n);
  for(int i = 0; i < n; i++)
  {
    int pre;
    scanf("%d", &pre);
    for(;cur < pre; cur++)
    {
      s[++p] = 1;
      for(int j = 0; j < p; j++) s[j]++;
    }
    printf("%d%c",s[p--],(i == n ? '\n' : ' '));
  }
  return 0;
}

你可能感兴趣的:(Vijos,栈)