第一题:

题目描述:某业务平台策划了一次运营推广活动,通过向新用户推送广告消息,吸引用户到平台中来。现在已经给用户person_i发推送消息,需要支付cost_i的费用,但是该用户只有p_i(0<=p_i<=1)的概率会被吸引到平台中,即该用户的转化期望为p_i,那么定义:期望推广成本avf_cost=总费用/总期望转化用户数。请问:如何选择用户并推送广告,确保avg_cost<=K的同时能给平台吸引到最多的新用户?


说明:没有通过,后面整理的


解题思路:希望尽可能多的吸引到用户,同时还要满足avg_cost<=K。理论上是要找cost/expect尽可能小的用户,越是cost/expect小, avg_cost就会更小。

1、将用户列表依照cost/expect从小到大排序;

2、然后根据排序后的用户列表由小到大贪心判断是否要加入下一个用户,计算加入这个用户后,avg_cost是否还满足<=K,如果不满足,就结束循环,因为后面的用户cost/expect都大于该用户,更不满足条件,如果满足,就加入结果列表中;


代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
struct user{int id;double cost, expect;bool operator < (const user& a) const {double x = cost / expect;double y = a.cost / a.expect;return x < y;}//user() : id(0), cost(0.0), expect(0.0) {}//user(int i, double c, double e) : id(i), cost(c), expect(e) {}
};
vector<int> calculateUserList(vector<int>& userIdList, vector<double>& costList,vector<double>& conversionList, double avg_cost) {int n = userIdList.size();vector<user> all(n);user tmp;for (int i = 0; i < n; ++i) {//user tmp = new user(userIdList[i], costList[i], conversionList[i]);tmp = { userIdList[i], costList[i], conversionList[i] };all[i] = tmp;}sort(all.begin(), all.end());//double cur_cost = 0.0, cur_expect = 0.0;vector<int> res;for (int i = 0; i < all.size(); ++i) {int id = all[i].id;double tmp_cost = all[i].cost;double tmp_expect = all[i].expect;if ((cur_cost + tmp_cost) / (cur_expect + tmp_expect) <= avg_cost) {res.push_back(id);cur_cost += tmp_cost;cur_expect += tmp_expect;}else {break;}}return res;
}
int main() {vector<int> person = { 1, 2, 3, 4, 5 };vector<double> cost = { 2.0, 3.0, 1.0, 4.0, 2.0 };vector<double> expect = {0.2, 0.1, 0.2, 0.1, 0.4};double K = 9.5;vector<int> res = calculateUserList(person, cost, expect, K);for (int i = 0; i < res.size(); ++i) {if (i == 0) cout << res[i];else cout << " " << res[i];}cout << endl;
}

第二题:

题目描述:已知完成一个简单的工作需要1天工时,完成一个中等难度的工作需要2天工时,完成一个困难的工作需要4天工时。假设未来4周有n个工作日有空闲时间可以用来接受这些工作,请编程返回能够填满n个工作日所有可能的任务排列数。可用1,2,4分别表示简单、中等、困难的任务。


示例1:

输入:0

输出:0

示例2:

输入:1

输出:1

只有一种排列:{1}

示例3:


说明:此题AC


解题思路:使用DP

1、初始化:dp[0] = 0,dp[1] =1, dp[2]=2, dp[3]=3, dp[4]=6

1、对于n>5的情况,由于只有1,2,4的可能,dp[n] = dp[n-1]+dp[n-2]+dp[n-4]


代码如下:

#include<iostream>
#include<vector>
using namespace std;
int workSchedule(int n) {if (n <= 3) return n;vector<int> dp(n + 1);for (int i = 0; i < 4; ++i) dp[i] = i;dp[4] = 6;for (int i = 5; i <= n; ++i) dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 4];return dp[n];
}
int main() {int n;cin >> n;cout << workSchedule(n) << endl;
}

第三题:

题目描述:Zeoy同学正在对vivo游戏中心的某款游戏做分析评估。已知该游戏中有N个武将,每个武将均有K个属性(例如:武力、智力、敏捷、防御等等),若对于每个属性来说,武将A该属性的值都大于武将B该属性的值,那我们就称之为武将A碾压武将B

先给出一个二维数组heroes[N][K],其中N表示有多少个武将,K表示有多少个属性值(每个属性值均为整数),请你帮助Zeoy在所有武将中挑选出尽可能多的武将,使挑选出来的武将两两之间都存在碾压关系。请问最多能挑选出多少个符合条件的武将?

注:若无法挑出任意两个武将形成碾压关系时,返回0。


说明:此题过了60%


解题思路:这道题和华为-叠积木很类似,首先需要建立一个比较方法,如果英雄B的属性均大于英雄B的属性,那么B>A,然后将问题转成求最大子序列的问题;


代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool compare(vector<int>& A, vector<int>& B, int K) {// 默认A是排在B前面的,A[0]<=B[0]for (int i = 0; i < K; ++i) {if (A[i] >= B[i]) return false;}return true;
}
int maxRollingHeroes(vector<vector<int> >& heroes) {int N = heroes.size(), K = heroes[0].size();sort(heroes.begin(), heroes.end(), [](vector<int>& a, vector<int>& b) {return a[0] < b[0];});vector<int> dp(N);dp[0] = 1;int res = 0;for (int i = 1; i < N; ++i) {for (int j = 0; j < i; ++j) {if (compare(heroes[j], heroes[i], K)) dp[i] = max(dp[i], dp[j] + 1);}res = max(res, dp[i]);}return res;
}
int main() {int N, K;cin >> N >> K;vector<vector<int>> heroes(N, vector<int>(K, 0));for (int i = 0; i < N; ++i) {for (int j = 0; j < K; ++j) {cin >> heroes[i][j];}}cout << maxRollingHeroes(heroes) << endl;
}

结果如下:

【秋招机试真题】VIVO笔试-0922相关推荐

  1. 【秋招机试真题】华为机试0908-梅花桩

    /* *    题目描述: *        有一个M*N的梅花桩阵,每个桩都有允许跳跃的最大步数,用户从0.0的位置开始跳跃, *    允许向右和向下方向跳跃,求最少要跳跃多少次才能达M-1, N ...

  2. 【秋招机试真题】网易笔试0919

    第一题: 题目描述:无聊的牛牛突发奇想,想将手中的一排格子红蓝两种颜色,对于每个格子牛牛都有自己的想法.例如,如下的格子. 1号和2号格子涂蓝色,3号格子涂红色,4号格子涂蓝色,5号格子涂红色,6.7 ...

  3. 【秋招机试真题】寒武纪0919机试

    第一题: 题目描述: 寒武纪OJ比赛,定义了如下分数处理规则 | 每个参加者的分数范围都是[0, 100] | 分数低于40分的为不及格成绩 HR小姐姐为了统计方便,会对比赛的分按照下面规则处理: | ...

  4. 【秋招机试真题】华为机试0407-1-幼儿园小朋友分组

    /* *    题目描述:         幼儿园老师安排小朋友做游戏,现在需要给N个小朋友进行分组,老师让每个同学写一个名字,代表这位小朋友         想和谁分到一组,请问老师在满足所有小朋友 ...

  5. 【秋招机试真题】荣耀机试0916-3-可重复选元素组合问题

    /* *   题目描述: *       dota游戏里面,召唤师可以控制冰雷火三种元素,并通过元素组合 *   产生新的技能.现在我们修改了一张新的地图,地图中他能够控制n种元素, *   并且将m ...

  6. 【华为社招机试真题】一个正整数到Excel编号的转换[满分]

    题目描述 用过excel的都知道excel的列编号是这样的: a b c - z aa ab ac - az ba bb bc - yz za zb zc - zz aaa aab aac - 分别代 ...

  7. 中科大-计算机类考研真题(初试笔试真题详解+复试笔试机试真题详解+面试问题汇总分析)

    中科大-计算机类考研真题(初试笔试真题详解+复试笔试机试真题详解+面试问题汇总分析) 初试笔试真题2003年~2019年:答案+详解 复试面试问题总结:问题汇总+详解分析 复试面试经验总结:个人小结 ...

  8. 【华为OD机试真题 python】连续出牌数量【2022 Q4 | 200分】

    前言 <华为OD笔试真题 python> 专栏含华为OD机试真题.华为面试题.牛客网华为专栏真题. 如果您正在准备华为的面试,或者华为od的机会,有任何想了解的可以私信我进行交流.我会尽可 ...

  9. 【华为OD机试真题 python】补种未成活胡杨 【2022 Q4 | 100分】

    前言 <华为OD笔试真题 python> 专栏含华为OD机试真题.华为面试题.牛客网华为专栏真题. 如果您正在准备华为的面试,或者华为od的机会,有任何想了解的可以私信我进行交流.我会尽可 ...

最新文章

  1. 反汇编工具 win32asm
  2. 如何下载kaggle上的数据集
  3. niosII EDS和QuartusII安装心得体会
  4. 安全性问题(数据篡改(拿到别人的URL,篡改数据(金额)发送给系统))
  5. C语言使用Linked List实现Queue(附完整源码)
  6. Activity的回调机制---Activity学习笔记(三)
  7. 生成sql条件的类(转)
  8. Java输出特定时间段特定格式时间信息
  9. Vue-router之集成
  10. 2016-2017-2 20155117实验二《Java面向对象程序设计》实验报告
  11. Ubuntu下apache配置文件路径
  12. margin和padding的学习
  13. php 爬取一个人的网易云评论,爬取网易云音乐某一个人的评论
  14. 软考高级 真题 2016年下半年 信息系统项目管理师 综合知识
  15. 免费下载 客道巴巴文档 教程
  16. 163邮箱 java发送html邮件,java邮件发送 qq与163邮箱互发和qq和163邮箱发送其余邮箱实例...
  17. “知乎精英”怎么就成了骂人的词
  18. 如何提高服务器硬盘读写速度,如何加速硬盘读写速度,如何完全控制ntfs 分区...
  19. 游戏音效中竟然有3D音效,这是什么鬼?
  20. fits文件读取代码

热门文章

  1. 关于微信静默登陆和OAuth2
  2. Spark原理与调优
  3. http 漏洞解决办法
  4. 见过没密码的wifi吗?小心,那是黑客的圈套
  5. git 更新远程仓库的代码
  6. 计算机网络 - 练习(三十)
  7. 微软:首个中国政府专用版Win10系统已完成
  8. 纯CSS3实现鼠标悬浮内容自动撑开的过渡动画
  9. Servlet-原理转载 (https://www.cnblogs.com/cangqinglang/p/9290626.html)
  10. Nhanes临床数据库挖掘教程2—非正态数据的基线表绘制(2)