测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A49760. 部分排序程序命名:sort.cpp

填空题 中等

题目描述

部分排序

程序命名:sort.cpp

题目描述

一个数列P中有n个数。小蓝从中选择位置连续的k个数,并对这k个数进行升序排列。求排序后的数列有多少种?

输入

n k

P0 P1...Pn-1

其中:所有的輸入都是整数,2<=n<=100 ,  2<=k<=n  ,  0<=Pi<=n-1  ,

P0,P1,..Pn-1数值都不相同。

输出

部分排序后数列的排列数。

样例输入

5 3

0 2 1 4 3

样例输出

2

样例说明:从原数列抽取连续3个数排序后有2种可能性:(0,1,2,4,3)和(0,2,1,3,4)

参考答案

#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N = 110; //b记录本次排序后的数列 //last记录上次排序得到的数列 int a[N], b[N], last[N]; int n, k; //检查两个数列是否相同 bool check(int a[], int b[]) { for(int i = 0; i < n; i ++) if(a[i] != b[i]) return false; return true; } int main() { cin >> n >> k; for(int i = 0; i < n; i ++) cin >> a[i]; //将原数列a拷贝到last中 memcpy(last, a, sizeof a); int sum = 0; //枚举所有连续k个数的起始位置 for(int i = 0; i <= n - k; i ++) { //将a拷贝到b中进行排序 memcpy(b, a, sizeof a); sort(b + i, b + i + k); //排序后与上一个序列不相同 if(!check(last, b)) sum ++; //将b拷贝到last memcpy(last, b, sizeof b); } cout << sum << endl; return 0; }
上一题 下一题