Vijos P1062 迎春舞会之交谊舞

Posted hxer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vijos P1062 迎春舞会之交谊舞相关的知识,希望对你有一定的参考价值。

题目链接:https://vijos.org/p/1062

题意:输入n(n <= 1500)个女生左边有多少个男生。每个女生都和她左边最近的男生跳舞。

输出每个女生到可以与之跳舞的男生之间有几个男生;(包括跳舞的男生)

input

6
4 5 6 6 6 6
output

1 1 1 4 5 6

思路:简单的递推即可;并没有用到栈。。对于第i个女生,易知当该女生左边男生的数量比前一个女生的数量多时,结果就是1.但是当出现连续的相等时,即表示这些女生之前没有男生,这时我们就需要先前找"可用"的男生了。即向前一个位置,就有一个最近的男生被前一个位置的女生抢走了。这是代表当前的第i位的女生可选的男生数量-1了。一直到可选的数量比当前比较的女生数量多时,她就可以从中取一个了;其实就是模拟;时间复杂度为O(n^2)的

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define inf 0x7fffffff
template<typename T>
void read1(T &m)
{
    T x=0,f=1;char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
    m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
const int N = 3001;
int f[N];
int main()
{
    int n;
    read1(n);
    rep1(i,1,n) read1(f[i]);
    printf("1");
    rep1(i,2,n){
        int cnt = 0,tmp = f[i];
        for(int j = i - 1;tmp <= f[j];j--)
            tmp--,cnt++;
        printf(" %d",cnt+1);
    }
    puts("");
    return 0;
}

 

以上是关于Vijos P1062 迎春舞会之交谊舞的主要内容,如果未能解决你的问题,请参考以下文章

Vijos P1063 迎春舞会之交谊舞 DP

Vijos P1061 迎春舞会之三人组舞 DP

18.03.25 vijos1063迎春舞会之集体舞

[dp]vijos1063 迎春舞会之集体舞

18.03.25 vijos1061迎春舞会之三人组舞

COGS 1051. [Vijos1021] Victoria的舞会1