2023 百度春招笔试题

1,601 阅读2分钟

求大佬解答,俺爆零,呜呜呜呜,有待更新。。。

小红的数组拆分

题目描述

把长度为n的数组,拆分成k个非空子序列,使得k个子序列的平均数之和尽可能的小

输入描述

第一行输入两个正整数nk,代表数组的长度,子序列的数量。 第二行输入n个正整数aia_i,代表数组的元素

1kn1051 \leq k \leq n \leq 10^5

109ai106-10^9 \leq a_i \leq 10^6

输出描述

一个小数,代表最终平均数之和的最小值,如果你的答案和正确答案误差不超过10610 ^{-6},则认为答案是正确的。

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

template<class T>
void print(vector<T> &arr) {
	for(auto e : arr) cout << e << " ";
	cout << endl;
}
int main() {
	freopen("in1.txt", "r", stdin);
	int n, k;
	cin >> n >> k;
//	cout << n << k;
	vector<int> arr(n);
	for(auto &e : arr) cin >> e;
//	print(arr);
	sort(arr.begin(), arr.end());
//	print(arr);
	double ans = 0;
	long long sum = accumulate(arr.begin(), arr.end(), 0LL);
//		cout << sum << endl;
	for(int i = 0; i < k - 1; i++) {
		ans += arr[i];
		sum -= arr[i];
//		cout << sum << endl;
	}
	ans += (double) sum / (n - k + 1);
//	cout << ans << endl;
	printf("%.11llf\n", ans);
	return 0;
}


/*
4 3
-1 2 -1 3

0.50000000000

*/

小红的区间排列

题目描述

输入描述

有多组数据,首先输入一个正整数T,表示有T组数据,每组的第一行输入一个正整数n,代表排列的大小,每组数据的第二行输入n个正整数aia_i,代表小红拿到的排列。

1T21 \leq T \leq 2,对于90%的数据T=1

1n2×1051 \leq n \leq 2 \times 10^5 保证所有数据n的总和不超过2×1052 \times 10^5

输出描述

输出一个整数,代表多少区间能构成一个排列。

示例

输入

2
5
1 2 3 4 5
5
2 1 5 3 4 

输出

5 
3
#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

template<class T>
void print(vector<T>& arr) {
    for (auto e : arr) cout << e << " ";
    cout << endl;
}
int main() {
	int t;
	cin >> t;
	while(t--){
		int n;
		cin >> n;
		vector<int> arr(n);
		for(auto &e : arr) cin >> e;
	}
	return 0;
}

/*

*/

小红走矩阵

题目描述

输入描述

T组测试用例,第一行输入一个正整数T,表示用例个数。 接下来T行,每行两个正整数n和m,表示矩阵的大小。

1T,n,m20001 \leq T,n,m \leq 2000

输出描述

输出T行,每行一个整数,表示该组用例的答案。 答案可能很大,请对109+710^9+7取模后再输出。

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;
const int mod = 1e9 + 7;


template<class T>
void print1(vector<T>& arr) {
    for (auto e : arr) cout << e << " ";
    cout << endl;
}

template<class T>
void print2(vector<vector<T>>& arr) {
    for (auto e : arr) print1(e);
    cout << endl;
}


int main() {
	int t, m, n;
	cin >> t;
	while(t--){
		cin >> n >> m;
		vector<vector<int>> dp(n + 1, vector<int>(m + 1));
	
		dp[1][1] = 1;
		for(int i = 2; i <= n; i++) {
			for(int ii = 1; i - ii > 0; ii+=2){
				dp[i][1] += dp[i -ii][1];
				dp[i][1] %= mod;
			}
		} 
//		print2(dp);
		for(int j = 2; j <= m; j++){
			for(int jj = 1; j - jj > 0; jj += 2){
				dp[1][j] += dp[1][j - jj];
				dp[1][j] %= mod;
			}
		}
//			print2(dp);
		for(int i = 2; i <= n; i++) {
			for(int j = 2; j <= m; j++) {
				for(int ii = 1; i - ii > 0; ii += 2) {
						dp[i][j] += dp[i - ii][j] ;
						dp[i][j] %= mod;
				}
				for(int jj = 1; j - jj > 0; jj += 2){
						dp[i][j] += dp[i][j - jj];
						dp[i][j] %= mod;
				}
			}
		}
	cout << dp[n][m] << endl;
	}
	return 0;
}

/*
example 1
1
2 4

6

example 2
2
5 4
3 6

66
54
*/