当前位置: 首页 > news >正文

互联网 网站建设价格国内广告投放平台

互联网 网站建设价格,国内广告投放平台,做的网站怎么发布,天津电子商务网站建设题目来自DOTCPP: 思路: ①每次找到数列中的最小值下标,然后用状态数组st标记它,相当与删除它,之后就不会访问它。 ②对最小值下标左边和右边判断一下,看有没有数字,如果有就把最小值加到两边第…

题目来自DOTCPP:

思路:

①每次找到数列中的最小值下标,然后用状态数组st标记它,相当与删除它,之后就不会访问它。

②对最小值下标左边和右边判断一下,看有没有数字,如果有就把最小值加到两边第一个数字。

暴力代码如下(会超时):

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e5+10;int n, k;
int arr[N];
bool st[N];//记录一个数字有没有选过signed main(){cin >> n >> k;for(int i = 1; i <= n; i++) cin >> arr[i];for(int i = 1; i <= k ; i++){//找到最小值在数组中的位置int minv = 1e18;int ssmin = -1;for(int j = 1; j <= n; j++){if(minv > arr[j] && !st[j]){//更新最小值的坐标ssmin = j;minv = arr[j];}}//将最小值标记st[ssmin] = true;//将最小值加到右边第一个数字if(ssmin > 1 ){for(int m = ssmin; m >= 1; m--){if(!st[m]){arr[m] += minv;break;}}}//将最小值加到左边第一个数字if(ssmin < n){for(int k = ssmin; k<= n; k++){if(!st[k]){arr[k] += minv;break;}}}}for(int i =1; i <= n; i++){if(st[i]) continue;cout << arr[i] << " ";}return 0;
}

代码优化:

上面代码K次排序,在N个数中找到最小值。时间复杂度爆炸,我们需要对它优化。需要用到小根堆来记录最小值的下标,同时对于最小值的下标两边,我们用链表记录,会减少很多时间。

小根堆+链表:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e5+20;#define x first
#define y second
typedef pair<int, int> PII;int n, k;
int arr[N];//数据
//优先队列-小根堆
//q第一个参数为值,第二个参数为这个值的下标
priority_queue<PII, vector<PII>, greater<PII>> q;
//链表
int l[N], r[N];signed main(){cin >> n >> k;for(int i = 1; i <= n; i++){cin >> arr[i];//存入优先队列q.push({arr[i],i});//记录左右两边坐标 最左边和最右边都记为-1l[i] = i-1;r[i] = i+1;//最右边记为-1if(r[i] == n+1){r[i] = -1;}}//开始K次操作while(k--){//取出最小值auto t = q.top();//删除最小值q.pop();//最小值的 值、坐标int num = t.x, pos = t.y;//后面pos两边第一个数加上num后,q中的值发生改变//我们没有记录 因此我们要判断一下if(num != arr[pos]){//我们之前删除了这个数,然后在更新一下//因为我们取得值不是更新过的值(这个值是原来的,没有加上最小值)q.push({arr[pos], pos});k++;//**同时这次操作要重新来过 k++continue;}//对删除的数标记一下,方便输出arr[pos] = -1;//对左右两边第一个数加上最小值//对删除最小值下标的链表更新,即pos左边和右边链接在一起if(l[pos] >= 1){//左边数加上最小值arr[l[pos]] += num;//pos左边链接到pos右边r[l[pos]] = r[pos];}if(r[pos] >= 1){//右边数加上最小值arr[r[pos]] += num;//pos右边链接到pos右边l[r[pos]] = l[pos];}} for(int i = 1; i <= n; i++){if(arr[i] != -1){cout << arr[i] << " ";}}return 0;
}

注意:代码中pos左右两边的数的下标,在arr数组中加上最小值之后,在q中是没有更新的,因此我们要判断一下,q中取出最小值的下标和我们在arr数组中相同下标的元素的值是否相等,不相等的话,就要更新一下。同时,这次操作没有对pos两边的元素进行操作,则k++。

http://www.cadmedia.cn/news/4944.html

相关文章:

  • 坂田做网站建设好的网络公司惠州seo网站管理
  • 网站建设的费用是多少钱久久seo正规吗
  • 奉贤做网站建设俄罗斯搜索引擎入口 yandex
  • 网站上文章字体部分复制怎么做宁波谷歌seo推广
  • 网页设计商品页面制作搜索广告优化
  • 晓风彩票网站建设软件推广方案有哪些
  • 北京发布疫情最新消息如何优化网络速度
  • 定制棺材网站营销的目的有哪些
  • 建设综合购物网站免费网络推广100种方法
  • 最近10个新闻成都关键词优化平台
  • 淘宝网站建设方式360优化大师最新版下载
  • wordpress调用幻灯片seo排名推广工具
  • 良品铺子网站建设中国新闻网发稿
  • 做个政府网站要多少钱天津seo网站管理
  • 开发app需要的资源和团队seo建站工具
  • 成都自适应建站哪家好360关键词排名百度
  • 电气行业网站建设多少钱百度2019旧版本下载
  • 维影企业网站管理系统搜索引擎优化中的步骤包括
  • 政府网站建设 重要性免费发seo外链平台
  • 英文网站建设推广万网登录入口
  • 360搜索优化搜索引擎广告优化
  • 指定词整站优化网站百度
  • 供应链管理系统名词解释seo网站推广目的
  • 南江县住房和城乡建设局网站网络营销心得体会
  • 项目网站的建设有两种模式广州网站运营
  • web前端毕业设计作品郑州seo外包费用
  • 厦门市思明区建设局网站sem运营有出路吗
  • 创建直播平台seo推广优化平台
  • 无障碍网站建设推广前景营销软件培训
  • 网站编程所用的语言有百度站长工具如何使用