给定一个未排序的整数数组, 需要给数组里每个元素一个整数权重值,权重值最小为1,相邻元素数字大的权重值也必须较大,那么整个数组的权重值总和最小为多少-笔试面试资料

这是qklbishe.com第9632 篇笔试面试资料
提供答案分析,通过本文《给定一个未排序的整数数组, 需要给数组里每个元素一个整数权重值,权重值最小为1,相邻元素数字大的权重值也必须较大,那么整个数组的权重值总和最小为多少-笔试面试资料》可以理解其中的代码原理,这是一篇很好的求职学习资料
本站提供程序员计算机面试经验学习,笔试经验,包括字节跳动/头条,腾讯,阿里,美团,滴滴出行,网易,百度,京东,小米,华为,微软等互联网大厂真题学习背诵。

答案:

给定一个未排序的整数数组, 需要给数组里每个元素一个整数权重值,权重值最小为1,相邻元素数字大的权重值也必须较大,那么整个数组的权重值总和最小为多少
给定一个未排序的整数数组, 需要给数组里每个元素一个整数权重值,权重值最小为1,相邻元素数字大的权重值也必须较大,那么整个数组的权重值总和最小为多少 我才不是游客
可以注意到每个数值的权值仅受其左右两侧的数值限制,而且很自然想到数组中最小的值权值一定是1。进一步想到,一个数字ai,如果它左右两侧数字都比它大,那么它的权值也可以设为1。
因此,将数组元素按值升序排序,并记录下标。枚举排序后的这些元素,更新这个元素和相邻元素的权值。
#include <bits/stdc++.h> typedef long long ll; using namespace std; struct node {     int id,v;     bool operator <(const node B)const     {         return v<B.v;     } } a[100005]; int n,b[100005],v[100005],ans; int main() {     ios::sync_with_stdio(0),cin.tie(0);     int i,j;     while(cin>>a[n+1].v) /**< a用来排序,b用来记录原始的数值 */         a[n+1].id=n+1,n++,b[n]=a[n].v;     sort(a+1,a+n+1);     for(i=1; i<=n; i++)     {         int id=a[i].id;         if(v[id]==0) /**< 如果id这个元素权值没给定过,那么它一定比它左右两端的小,可以置为1 */             v[id]=1;         if(id-1>0&&b[id]<b[id-1])/**< 检查下id这个元素能否更新其左右两侧的权值 */             v[id-1]=max(v[id-1],v[id]+1);         if(id+1<=n&&b[id]<b[id+1])             v[id+1]=max(v[id+1],v[id]+1);     }     for(i=1; i<=n; i++)         ans+=v[i];     cout<<ans;     return 0; } 

今天 11:38:49 回复(0)

文章部分来自互联网,侵权联系删除
www.qklbishe.com

区块链毕设网(www.qklbishe.com)全网最靠谱的原创区块链毕设代做网站
部分资料来自网络,侵权联系删除!
资源收费仅为搬运整理打赏费用,用户自愿支付 !
qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台 » 给定一个未排序的整数数组, 需要给数组里每个元素一个整数权重值,权重值最小为1,相邻元素数字大的权重值也必须较大,那么整个数组的权重值总和最小为多少-笔试面试资料

提供最优质的资源集合

立即查看 了解详情