牛客练习赛115 A Mountain sequence

文章介绍了一种计算整数数组形成山峰序列的排列数的方法,通过考虑最大值的绑定和初始答案1,利用动态编程求解。
摘要由CSDN通过智能技术生成

题目:

样例:

输入
3
5
1 2 3 4 5
3
3 3 3
3
1 2 1

输出
16
1
3

思路:

        依据题意,再看数据范围,可以知道暴力肯定是不可能了,然后通过题目意思,我们可以排列模拟一下,这里排列所得结果,联系上我们数学的排列组合知识点可以知道,这个山峰序列,我们排列的时候是围绕 “山峰” 来进行排列,即围绕最大的数值来进行排列,而当出现多个最大值的时候,我们必须将多个最大值绑定在一块,通过排列得知,我们排列左边是一个结果,排列一样的右边,也是一种结果,所以有 (排列个数 + 1)这里的 +1 是排列右边的结果,相当于镜面翻转。

其次,答案中至少有一种结果,即ans = 1,因为直接 sort 排序一遍,就是一个山峰序列,然后当我们记录的 (排列个数 + 1)就有最终答案 ans = ans * (排列个数 + 1) % MOD 这里注意一个条件就是我们的山峰序列是围绕的,所以不用算进 ans = ans * (排列个数 + 1) % MOD

例子1: 

 [1 , 2 ]   

ans = 1   

r[1] = 1

r[2] = 1
ans = ans * (r[1] + 1) % MOD = 2

即答案只有 2 种分别是  [1 , 2 ]   [2, 1 ]   

代码详解如下:

#include <iostream>
#include <unordered_map>
#define endl '\n'
#define x first
#define y second
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int MOD = 998244353;
int n;	// 数组大小
inline void solve()
{
	umap<int,int>r;	// 记录元素个数
	int ans = 1;	// 答案最终结果
	int maxs = -1;	// 取出  峰顶值 即 最大值
	cin >> n;
	for(int i = 0,x;i < n;++i)
	{
		cin >> x;
		++r[x];	// 统计元素个数
		maxs = max(maxs,x);		// 寻找 峰顶值
	}
	
	// 开始循环乘上每一种排列结果, 除去峰顶值的计算
	for(auto i : r) if(i.x != maxs) ans = ans * (i.y + 1) % MOD;
	
	// 输出答案
	cout << ans << endl;
}


signed main()
{
//	freopen("a.txt", "r", stdin);
	___G;
	int _t = 1;
	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

练习赛题目通常需要实际编程操作才能解答,但我会尽力提供指导。如果你想了解C语言解法,这里假设前三题分别是基础的数值计算或数据结构操作: 1. 如果是简单的算术题,比如求两数之和,你可以这样写: ```c #include <stdio.h> int main() { int a, b; printf("请输入两个整数:"); scanf("%d %d", &a, &b); int sum = a + b; printf("它们的和是:%d\n", sum); return 0; } ``` 2. 对于查找或排序算法,如查找数组中的最大值,可以这样做: ```c #include <stdio.h> int find_max(int arr[], int n) { int max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } } return max; } int main() { int array[] = {5, 8, 3, 9, 1}; int size = sizeof(array) / sizeof(array[0]); int max_value = find_max(array, size); printf("最大值是:%d\n", max_value); return 0; } ``` 3. 如果涉及字符串处理,比如比较两个字符串,可以这样实现: ```c #include <stdio.h> #include <string.h> int string_compare(const char *str1, const char *str2) { return strcmp(str1, str2); } int main() { char str1[] = "Hello"; char str2[] = "World"; int result = string_compare(str1, str2); if (result < 0) { printf("str1 %s str2\n", "is less than"); } else if (result > 0) { printf("str1 %s str2\n", "is greater than"); } else { printf("str1 %s str2\n", "equals"); } return 0; } ``` 请注意,这只是一个简化的例子,实际比赛中的题目可能会更复杂,你还需要考虑错误处理、输入验证等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值