华为od机试题
笔者于昨天下午刚考完机试题,记录下
核酸检测人员安排
在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。
每名采样员的效率不同,采样效率为N人/小时。
由于外界变化,采样员的效率会以M人/小时为粒度发生变化,M为采样效率浮动粒度,M=N*10%,输入保证N*10%的结果为整数。
采样员效率浮动规则:采样员需要一名志愿者协助组织才能发挥正常效率,在此基础上,每增加一名志愿者,效率提升1M,最多提升3M;
如果没有志愿者协助组织,效率下降2M。
怎么安排速度最快?求总最快检测效率(总检查效率为各采样人员效率值相加)。
输入描述
第一行一个值,采样员人数,取值范围[1,100];
第二个值,志愿者人数,取值范围[1,500];
第二行:各采样员基准效率值(单位人/小时),取值范围[60,600],保证序列中每项值计算10%为整数。
输出描述
第一行:总最快检测效率(单位人/小时)
示例1
输入
2 2
200 300
输出
500‘
直接优先队列,基础只有0.8*q[i]
给效率高的检测员分配志愿者
只能过80%的样例
#include <iostream> #include <algorithm> #include <queue> using namespace std; //最多100个采样员 const int N= 110; int q[N]; int main() { int n1,n2; cin>>n1>>n2; int res=0; for(int i=0;i<n1;i++){ cin>>q[i]; res+=q[i]*0.8; } //sort(q,q+n1,cmp); priority_queue<int,vector<int>,less<int>> myq; for(int i=0;i<n1;i++){ myq.push(0.2*q[i]); myq.push(0.1*q[i]); myq.push(0.1*q[i]); myq.push(0.1*q[i]); } // for(int i=0;i<n2;i++){ // int t=myq.top(); // res+=t; // myq.pop(); // } while(n2--){ res+=myq.top(); myq.pop(); } cout<<res<<endl; }
工具人网站下载csdn文章,没什么用
http://servicedev.tpddns.cn:8181/#/main/csdnPaper
荒地建设电站 /区域发电量统计
祖国西北部有一片大片荒地,其中零星的分布着一些湖泊,保护区,矿区.整体上常年光照良好,但是也有一些地区光照不太好。某电力公司希望在这里建设多个光伏电站,生产清洁能源对每平方公里的土地进行了发电评估,其中不能建设的区域发电量为0kw,可以发电的区域根据光照,地形等给出了每平方公里年发电量x千瓦。我们希望能够找到其中集中的矩形区域建设电站,能够获得良好的收益.
输入描述
第一行输入为调研的地区长,宽,以及准备建设的电站【长宽相等,为正方形】的边长最低要求的发电量
之后每行为调研区域每平方公里的发电量
输出描述
输出为这样的区域有多少个
示例1:
输入
2 5 2 6
1 3 4 5 8
2 3 6 7 1
输出
4
输入说明
调研的区域大小为长2宽5的矩形,我们要建设的电站的边长为2,建设电站最低发电量为6.
输出说明
长宽为2的正方形满足发电量大于等于6的区域有4个
示例2:
输入
2 5 1 6
1 3 4 5 8
2 3 6 7 1
输出
简单的计算数组前缀和的题目
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int m,n,a,k; cin>>m>>n>>a>>k; vector<vector<int>> q(m+10,vector<int>(n+10,0)); vector<vector<int>> help(m+10,vector<int>(n+10,0)); for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ cin>>q[i][j]; } } for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ help[i][j]=help[i-1][j]+help[i][j-1]-help[i-1][j-1]+q[i][j]; //cout<<help[i][j]<<endl; } } int res=0; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(i+a-1<=m && j+a-1<=n){ //cout<<help[i+a-1][j+a-1]-help[i+a-1][j-1]-help[i-1][j+a-1]+help[i-1][j-1]<<endl; if(help[i+a-1][j+a-1]-help[i+a-1][j-1]-help[i-1][j+a-1]+help[i-1][j-1]>=k)res++; } } } cout<<res<<endl; }
本期题目:机器人活动区域 🤖🕹️
题目
现有一个机器人,可放置于 M×N 的网格中任意位置, 每个网格包含一个非负整数编号, 当相邻网格的数字编号差值的绝对值小于等于 1 时, 机器人可以在网格间移动 问题: 求机器人可活动的最大范围对应的网格点数目。🤖💻 说明:
网格左上角坐标为 (0,0) ,右下角坐标为 (m−1,n−1) 🌐
机器人只能在相邻网格间上下左右移动 🤖👣
输入
第 1 行输入为 M 和 N ,M 表示网格的行数 N 表示网格的列数 之后 M 行表示网格数值,每行 N 个数值(数值大小用 k 表示), 数值间用单个空格分隔,行首行尾无多余空格 M、N、k 均为整数,且 1≤M,N≤150 ,0≤k≤50 📥
输出
输出 1 行,包含 1 个数字,表示最大活动区域的网格点数目 📤 行首行尾无多余空格 🙌 作者:发量迷人的乔喻 ******************************************************* 出处:bilibili
简单的flood fill算法
#include <iostream> #include <algorithm> using namespace std; const int N=200; int q[N][N]; int help[N][N]; int cnt(int m,int n,int q[N][N]){ int res=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(help[i][j]==1)res++; } } return res; } void dfs(int i,int j,int& m,int& n){ help[i][j]=1; if(i-1>=0 && !help[i-1][j] && (abs(q[i-1][j]-q[i][j])<=1))dfs(i-1,j,m,n); if(j-1>=0 && !help[i][j-1]&& (abs(q[i][j-1]-q[i][j])<=1))dfs(i,j-1,m,n); if(i+1<m && !help[i+1][j]&& (abs(q[i+1][j]-q[i][j])<=1))dfs(i+1,j,m,n); if(j+1<n && !help[i][j+1]&& (abs(q[i][j+1]-q[i][j])<=1))dfs(i,j+1,m,n); } int main() { int m,n; cin >> m >> n; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cin>>q[i][j]; } } int res=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ int prev=cnt(m,n,q); if(!help[i][j]){ dfs(i,j,m,n); } int nowcnt=cnt(m,n,q); res=max(res,nowcnt-prev); } } cout<<res<<endl; return 0; }