- 前言
- 一、[编程题]完美序列
- 1.1 题目连接
- 1.2 题面
- 1.3 思路
- 1.4 代码
- 二、[编程题]商场收益统计
- 2.1 题目链接
- 2.2 题面
- 2.3 思路
- 2.4 代码
- 三、[编程题]大橘为重
- 3.1 题目链接
- 3.2 题面
- 3.3 思路
- 3.4 代码
- 四、[编程题]叠大饼
- 4.1 题目链接
- 4.2 题面
- 4.3 思路
- 4.4 代码
面试的链接:https://www.nowcoder.com/test/35148556/summary
牛客的校招面试真题,稍微做了一下,写了快一个小时,不知道为啥只有 90 分,勉强写个题解吧
https://www.nowcoder.com/questionTerminal/4017903f92b6455790b4c670c7176156
1.2 题面 1.3 思路看一下数据范围 n n n 的范围是 1 e 4 1e4 1e4 ,只要 O ( N 2 ) O(N^2) O(N2) 以内的复杂度都能接受,于是我们可以先将数据处理为 − 1 、 1 -1、1 −1、1 的序列(分别对应小于等于 k k k 的数和大于 k k k 的数),然后对这个序列做一个前缀和,很显然,当一个序列的区间和大于 0 0 0 的时候就是一个完美的序列,那么我们只需要枚举一下区间的左端点,以及区间的长度即可,这样的话整体复杂度 O ( N 2 ) O(N^2) O(N2) 满足题目要求
ps:这里我开始以为能用双指针,琢磨了半小时发现写不出来(
1.4 代码#includeusing namespace std; #define endl "n" const int N = 1e5+10; int n,k; int a[N],b[N]; int main() { cin>>n>>k; int l = 0,r = 0; for(int i = 1;i <= n; ++i) { cin>>a[i]; a[i] = a[i] > k ? 1 : -1; b[i] =b[i-1] + a[i]; } int ans = 0; for(int l = 1;l <= n; ++l) { for(int r = l + ans;r <= n; ++r) { if(b[r]-b[l-1] >= 1) ans = max(ans,r-l+1); } } cout< 二、[编程题]商场收益统计 2.1 题目链接 https://www.nowcoder.com/questionTerminal/047b18918d914f19bb6b5f90a1949e00
2.2 题面 2.3 思路这题没啥好说的,弄一个 map
2.4 代码> 存一下商品的信息或者你用两个map 也是可以的,然后在下面的订单中我们进行比较即可 #includeusing namespace std; #define int long long #define mod 1000000007 #define endl "n" #define PII pair #define INF 0x3f3f3f3f int n,m; map > st; signed main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m; string s; int w,c; for(int i = 1;i <= n; ++i) { cin>>s>>w>>c; st[s]={w,c}; } int err = 0; long long sum = 0; for(int i = 1;i <= m; ++i) { cin>>s>>c; if(st[s].second < c) { err = -i; break; } st[s].second -= c; sum += st[s].first * c; } if(err != 0) { cout< cout< 三、[编程题]大橘为重 3.1 题目链接 https://www.nowcoder.com/questionTerminal/8f9de00dfbeb43d7bb58765aad9c5d78
3.2 题面 3.3 思路这个题面一出来我们就只能 “暴力”了,我们要在每一次询问的时候然后去暴力搜索吗?显然不可行,我们会发现对于这样的一个序列能产生的值就是一颗二叉树,于是我们可以先DFS 预处理一下所有可能存在的值,并存在一个数据结构(map)中,然后每次查询的时候直接找一下存在与否即可。
3.4 代码#include四、[编程题]叠大饼 4.1 题目链接using namespace std; #define ll long long #define mod 1000000007 #define endl "n" #define PII pair #define INF 0x3f3f3f3f unordered_map st; int n,q; void dfs(multiset S){ ll sum = 0; for(auto it : S) sum += it; st[sum] = true; ll len = S.size(); if(len == 1) return; ll av = sum / len; multiset min_s,max_s; for(auto it : S){ if(it > av) max_s.insert(it); else min_s.insert(it); } if(min_s.size() == 0 || max_s.size() == 0) return; dfs(max_s); dfs(min_s); } int main() { multiset S; scanf("%d%d",&n,&q); ll ai; for(int i = 1;i <= n; ++i) { scanf("%lld",&ai); S.insert(ai); } dfs(S); while(q--) { scanf("%lld",&ai); if(st[ai]) puts("YES"); else puts("NO"); } return 0; } https://www.nowcoder.com/questionTerminal/c2e0e9c1bd3e44b383781b7762944ec3
4.2 题面 4.3 思路这道题开始看一眼,和天梯赛的这题:L2-014 列车调度 很相似,但是稍有不同,这道题允许重组顺序,并且第 i i i 个大饼要比第 j j j 个大饼大,那么我们不难发现对于这个大饼的堆叠数量其实就是频率出现最高的饼,因为我们贪心的去想的话,那应该是如果能够放在当前这一堆里面,那必然不放在下一堆的里面,我们迟早会遇上同大小的饼子同时出现的清空,那么这个堆叠数量就不可避免
4.4 代码#includeusing namespace std; #define ll long long #define mod 1000000007 #define endl "n" #define PII pair #define INF 0x3f3f3f3f const int N = 1e5+10; int n,a[N]; map st; int main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n; for(int i = 0;i < n; ++i) { cin>>a[i]; st[a[i]]++; } int ans = 1; for(auto it : st) ans = max(ans,it.second); cout<



