右鸽的多人运动
南华算法分析与设计实验 右鸽的多人运动
题目
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的全部连续子序列。
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;
}