笔试——Day48
文章目录
- 第一题
- 题目
- 思路
- 代码
- 第二题
- 题目
- 思路
- 代码
- 第三题
- 题目
- 思路
- 代码
第一题
题目
疯狂的自我检索者
思路
模拟分别计算隐藏值取最小、最大的总和
代码
// https://ac.nowcoder.com/acm/problem/205826
#include <iostream>
using namespace std;int main()
{int n, m; cin >> n >> m;int res = 0;for(int i = 0; i < (n - m); i++){int x; cin >> x;res += x;}double a = 0, b = 0; // 可能的最小、最大a = res + m * 1;b = res + m * 5;a /= n;b /= n;printf("%.5f %.5f\n", a, b);return 0;
}
第二题
题目
NC115 栈和排序
思路
贪心
- 第一个出栈的数字是确定的为
n
-
- 先让元素入栈;
-
- 判断下一个目标元素;
-
- 栈中大于等于下一个目标元素的值都出栈
代码
#include <vector>
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 栈排序* @param a int整型vector 描述入栈顺序* @return int整型vector*/vector<int> solve(vector<int>& a) {// write code hereint n = a.size();stack<int> st;vector<int> res;int hash[50010] = {0};int aim = n;for(int i = 0; i < n; i++){int x = a[i];st.push(x);hash[x] = 1;while(hash[aim]){aim--;}while(st.size() && st.top() >= aim){res.push_back(st.top()); st.pop();}}return res;}
};
第三题
题目
加减
思路
贪心::尽可能选离的近的数,让他们变相同
枚举所有区间,找出区间内所有数变成相同数的最小代价cost <= k
的最大区间
- 如何求一个区间内的最小代价
cost???
- 数轴上有一些点,选一个位置,使所有点到该点距离和最小
选最中间点
- 前缀和优化求
cost = (mid - l)* a[mid] - (sum[mid - 1] - sum[l - 1]) + (sum[r] - sum[mid] - (r - mid) * a[mid])
代码
#include <iostream>
#include <algorithm>
using namespace std;
using LL = long long;const int N = 1e5 + 10;LL n, k;
LL arr[N];
LL sum[N]; // 前缀和LL f(int l, int r)
{int mid = (l + r) / 2;return (mid - l - r + mid) * arr[mid] - (sum[mid - 1] - sum[l - 1]) + (sum[r] - sum[mid]);
}int main()
{cin >> n >> k;for (int i = 1; i <= n; i++)cin >> arr[i];sort(arr + 1, arr + 1 + n);// 初始化前缀和for (int i = 1; i <= n; i++)sum[i] = sum[i - 1] + arr[i];int left = 1, right = 1, ret = 1;while (right <= n){// 进窗⼝LL cost = f(left, right);while (cost > k) // 判断{left++; // 出窗⼝cost = f(left, right);}// 更新ret = max(ret, right - left + 1);right++;}cout << ret << endl;return 0;
}