算法设计:右鸽的多人运动

右鸽的多人运动

南华算法分析与设计实验 右鸽的多人运动

题目

Description
众所周知,右鸽喜欢在深夜多人运动(别想歪了哈哈哈)。他对陪同运动的伙伴们的资产有着严格的要求,如果伙伴们的资产形成的序列是好序列,他才能跑步,否则只能散步。
下面给好序列下个定义:一个整数序列,存在唯一元素。即对于序列a,存在一个a[i]使得任意其他元素都不等于a[i],即a[i] != a[j] for 1 <=j<=len(a),j != i;
给出一个序列A,如果A的全部连续子序列都是好序列,才能说伙伴们的资产形成的序列是好序列,那么右鸽才能跑步,否则右鸽只能散步。
Input
输入描述:
第一行为整数n(1 <= n <= 2*10^5),表示陪同右鸽一起运动的伙伴人数。
第二行为n个整数a[i](0<=a[i] <= 10^9),描述他们的资产。
Output
输出描述:
一行字符串,如果右鸽能跑步,则输出:“paobu”
否则输出:“sanbu"

输入
5
1 2 3 2 1
输出:
paobu

环境

C++语言
Code::Blocks开发环境

实验设计

由题可知需要判断A的全部连续子序列是否都是好序列,则可选择穷举法。

主要分为三步:

1、得到A的全部连续子序列
j表示连续子序列的长度(2<=j<=A的长度(n)),用两个变量f,l来存连续子序列的头序号和尾序号。
通过对j的循环以及f,l的推移获取A的全部连续子序列。
获取A的连续子序列

2、逐一判断A的全部连续子序列是否都是好序列(是否有唯一元素)
编写了bool isgood(int x ,int y)函数通过序列内元素逐一比较来判断A的连续子序列是否是好序列,如果是好序列返回1,否则返回0。
3、得出跑步还是散步的结果
用bool paobu=1来记录最终结果,若好序列的判断函数 isgood()有返回为0的情况则改变变量 paobu=0,结束。
最后 paobu=1输出”paobu”, paobu=0则输出”sanbu”。

源代码

#include<iostream>
#include<bits/stdc++.h>

using namespace std;
vector<int> data;//变长数组
bool paobu=1;
/*-----------------   好序列的判断函数 --------------------*/
bool isgood(int x,int y)
{
    for(int a=x;a<=y;a++)
    {
        for(int b=x;b<=y;b++)
        {
            if(data[a]==data[b]&&a!=b){break;}
            if(b==y){return 1;}
        }
    }
    return 0;
}

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int t;
        cin>>t;
        data.push_back(t);
    }
    for(int j=2;j<=n;j++)//循环提取所有连续子序列
    {
        int l=j-1;
        for(int f=0;f<=(n-j);f++)
        {
            paobu=isgood(f,l);
            if(paobu==0)break;
            l++;
        }
        if (paobu==0)break;
    }
    if(paobu==1){cout<<"paobu"<<endl;}
    else cout<<"sanbu"<<endl;
    return 0;
}

运行结果

运行结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值