字节跳动笔试

第二题

题目描述

小红很喜欢刷抖音,抖音后台有一个推荐系统,小红向上滑动屏幕时,该推荐系统会计算成显示恰小红的翔视频

用数值量化而言。每个短视频有一个内存占用ai(画质越好的视频内存占用越大),以及该视频可以带给小红愉悦度为bi。

值得注意的是,当小红每次重复易到同一个视频时,观看该视频获得的愉悦度会除以2(向下取整)。例如,若一个视频初始给小红获得的愉悦度为 5,那么第二次小红获得的愉悦度会变成2,第三次为 1,第四次以后再刷到这个视频获得的愉悦度就为0了

小红一共进行了q次刷视频操作。

为了使得手机不卡顿,推荐系统每次会选择一个内存占用不赢于xi的视频。如奥有多个这样的视频,推荐系统会推荐满足条件的播放画质最好的那个视频(即内存占用最高的视频)。如果有多个视频的画质都是最好,那么推荐系统会推荐当前愉悦度最高的视频。

当小红观看完这个视频后,即可获得该视频的愉悦度,请你计算小红剧完所有视频时获得的总愉悦度。

输入

第一行:n个视频,q次刷取;

第二行:n个视频的内存占用;

第三行:n个视频的愉悦度;

第四行:q次刷取的内存额度。

示例

输入

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

输出

10

说明

第一次刷视频,推荐系统推荐给小红第一个视频。小红获得愉悦度3。第二次刷视频,推荐系统推荐给小红第一个视频。由于是第二次观看,小红获得愉悦度 1。第三次刷视频,推荐系统推荐给小红第二个视频,小红获得输悦度 4。第四次刷视频,推荐系统推荐给小红第三个视频。小红获得愉悦度2。

代码

维护一个map,map的key是视频的大小,map的value是一个priority_queue,包含该大小的所有视频的愉悦度。

#include <iostream>
#include <vector>
#include <map>
#include <queue>

int main() {
  long long n, q;
  cin >> n >> q;
  vector<pair<long long, long long>> vec(n);
  for (long long i = 0; i < n; ++i) {
	cin >> vec[i].first;
  }
  for (long long i = 0; i < n; ++i) {
	cin >> vec[i].second;
  }
  
  map<long long, priority_queue<long long>> videos;
  for (auto& p : vec) {
	videos[p.first].emplace(p.second);
  }
  
  vector<long long> x(q);
  for (long long i = 0; i < q; ++i) {
	cin >> q[i];
  }
  
  long long ans = 0;
  for (long long i = 0; i < q; ++i) {
	auto it = videos.upper_bound(x[i]);
	it--;
	long long cur = it->top();
	ans += cur;
	it->pop();
	it->push(cur / 2);
  }
  
  cout << ans << endl;
}

第三题

描述

小红在玩一个大富贫游戏,游戏的地图为一排房子,从左到右喻马依次从1到n。

每个房子有一个购买价格ai和一个经过它的房租价格bi,当小红经过一个自己没有购买的房子时,她就需要交房租 (已购买的房子则不需要交房租)。

在游戏开始前,小红可以购买任意数量的房子,然后开始游戏。

游戏中,小红会按照一个给定的排列p的顺序依次经过所有的房子(排列p为房子的编号顺序,p的大小为n,即每个房子都会作为一次目标)。

小红每经过一套房子都需要交租金,除非已购买。初始小红在第一个房子的左边,当她按够顺序经过了所有房子后,她会再次移动到第n个房子的右边。

请你计算小红最少的总花费。

输入输出

第一行输入一个整数n,代表房子的总数;
第二行输入一个排列pi,代表小红经过的房子编号;
第三行输入n个整数ai,代表房子的购买价格;
第四行输入n个整数bi,代表房子的房租价格;
保证[1, n]中每个数在p中出现且仅出现一次。
一行一个整数,代表最少的总花费

示例

4
1 3 2 4
5 4 2 4
1 3 1 1
8
游戏开始前买下第二个房子,花费4。
开始游戏时,小红先向右走一步到达1号房子,房租价格为1。
然后向右走2步到达3号房子,当小红经过2号房子时由于2号房子已经购买,则不用交房租。
然后到达3号房子时交房租价格为1。
然后向左走1步到达2号房子,不需要交房租。
然后向右走2步到达4号房子,经过的3号房子和4号房子分别交价格为1的房租。
最后向右离开这个大富翁地图。

代码

差分数组

#include <iosream>
#include <vector>

using namespace std;

int main() {
  int n;
  cin >> n;
  vector<int> p(n + 2, 0);
  for (int i = 1; i <= n; ++i) cin >> p[i];
  p[n + 1] = n;
  
  vector<int> a(n + 1, 0);
  for (int i = 1; i <= n; ++i) cin >> a[i];
  
  vector<int> b(n + 1, 0);
  for (int i = 1; i <= n; ++i) cin >> b[i];
  
  int pos = 0;
  vector<int> pre(n, 0);
  for (int i = 1; i <= n + 1; ++i) {
	// 向右走
	if (pos <= p[i]) {
	  pre[pos + 1] += 1;
	  pre[p[i] + 1] -= 1;
	}
	// 向左走
	else {
	  pre[pos] -= 1;
	  pre[p[i]] += 1;
	}
	pos = p[i];
  }
  
  long long ans = 0;
  for (int i = 1; i <= n; ++i) {
	pre[i] += pre[i - 1];
	ans += min((long long)a[i], (long long)pre[i] * b[i]);
  }
  
  cout << ans << endl;
}

全部评论
看起来第二题可以用扫描线做
点赞 回复 分享
发布于 2023-10-19 14:58 江苏

相关推荐

凉风落木楚山秋:1.教育背景,这一栏用于说明你是哪个省份的,一般四非在省内认可度是高于外省的,但是到外边了基本路边一条。然后这一栏可以写一写校内荣誉补充满一行 2.个人介绍没必要,把下面的技能内容放到这里面来,个人情况挖空等面试官来问你 3.竞赛奖项单独一栏,专门用2-3行小字写你获得了哪些奖 4.后面的模块就分为实习经历和项目经历,一个写实习做的项目,一个写学校做的项目。另外在项目中承担的角色可以标出来,时间周期也可以写一下 5.其他,你的经历和我挺像,我也大二的时候做前端,看你想找小程序还是web方向的。做小程序我感觉你这简历已经够了,比我的水货学弟强多了。要做web的话尽量再写一个react项目,不然走不远。另外,那个排课的项目看起来好水,没有亮点,可以再挖掘一下 6.名称,技术名称书写风格不统一,要么统一大驼峰,要么就用全小写+空格,保持一致好看很多
点赞 评论 收藏
分享
评论
1
18
分享

创作者周榜

更多
牛客网
牛客企业服务