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

做网站需要规划好什么百度竞价开户渠道

做网站需要规划好什么,百度竞价开户渠道,深圳自适应网站推广价格,手机版网站建设价格晚会节目单 原题目链接 题目描述 小明要组织一台晚会,总共准备了 n 个节目。然而晚会时间有限,他只能从中选择 m 个节目。 这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。 小明发现观众对于晚会的喜欢程度与前几个节目的好看程度…

晚会节目单

原题目链接

题目描述

小明要组织一台晚会,总共准备了 n 个节目。然而晚会时间有限,他只能从中选择 m 个节目。

n 个节目是按照小明设想的顺序给定的,顺序不能改变

小明发现观众对于晚会的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。

小明为每个节目定义了一个好看值,请你帮助他选择出 m 个节目,满足他的要求。


输入描述

  • 第一行包含两个整数 n, m,表示节目的总数和要选择的节目数。
  • 第二行包含 n 个整数,表示每个节目的好看值。

数据范围:

  • 1 ≤ n ≤ 10^5
  • 0 ≤ 节目的好看值 ≤ 10^5

输出描述

输出一行包含 m 个整数,为选出的节目的好看值,按选择顺序输出。


输入输出样例

输入

5 3
3 1 2 5 4

输出

3 5 4

样例说明

选择了第 1、4、5 个节目,得到的好看值序列是:3 5 4,在所有保持顺序的选择中是字典序最大的。

c++代码

#include<bits/stdc++.h>using namespace std;int n, m;
vector<int> arr, trees, tem;
unordered_map<int, vector<int>> mp;class node{
public:int val, num, index;
};void build(int p, int l, int r) {if (l == r) {trees[p] = arr[l];return;}int mid = (l + r) / 2;build(2 * p, l, mid);build(2 * p + 1, mid + 1, r);trees[p] = max(trees[2 * p], trees[2 * p + 1]);
}int ask(int p, int l, int r, int left, int right) {if (l >= left && r <= right) return trees[p];int mid = (l + r) / 2, a = 0, b = 0;if (mid >= left) a = ask(2 * p, l, mid, left, right);if (mid < right) b = ask(2 * p + 1, mid + 1, r, left, right);return max(a, b);
}void bfs() {node k, w;k.val = ask(1, 1, n, 1, n - m + 1), k.num = 0;queue<node> q;for (int x : mp[k.val]) {if (x > n - m + 1) break;k.index = x;q.push(k);}while(!q.empty()) {k = q.front(), q.pop();if (k.val < tem[k.num]) continue;else tem[k.num] = k.val;if (k.num == m - 1 || k.index + 1 > n || n - (m - k.num - 1) + 1 > n || k.index + 1 > n - (m - k.num - 1) + 1) continue;w.val = ask(1, 1, n, k.index + 1, n - (m - k.num - 1) + 1), w.num = k.num + 1;for (int x : mp[w.val]) {if (x <= k.index) continue;if (x > n - (m - k.num - 1) + 1) break;w.index = x, q.push(w);}}
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);cin >> n >> m;arr = vector<int>(n + 1), trees = vector<int>(4 * n), tem = vector<int>(m);for (int i = 1; i <= n; i++) cin >> arr[i], mp[arr[i]].push_back(i);build(1, 1, n);bfs();for (int i = 0; i < m; i++) {cout << tem[i];if (i != m - 1) cout << " ";}return 0;
}

实现思路

讲一下我的思路

首先我对这道题目的理解是,我们需要频繁查询区间最大值。

我们来看样例

5 3

3 1 2 5 4

实际上只有3 1 2可以选,因为选择5 4组成不了3个数

区间[1, 3]查询最值为3

实际上我们选了3后,只需要在3 的后面找两个数,那么4不可以选,因为凑不了两个

区间[2, 3]查询最值为5

同理区间[5, 5]查询最值为4

最终答案为3 5 4

然而,样例不会都这么简单,肯定有些分数是重复的,具体怎么解决重复。看下面解析。

算法步骤

我们刚刚得出,这个题目需要频繁地区间查询最值,我们选择线段树来解决,线段树查询一次最值只要O(logn)的时间。

读取输入

cin >> n >> m;
vector<int> arr(n + 1);
for (int i = 1; i <= n; i++) cin >> arr[i], mp[arr[i]].push_back(i);

构造线段树,编写查询方法

vector<int> trees(4 * n);//线段树定义void build(int p, int l, int r) {//递归建树if (l == r) {trees[p] = arr[l];return;}int mid = (l + r) / 2;build(2 * p, l, mid);build(2 * p + 1, mid + 1, r);trees[p] = max(trees[2 * p], trees[2 * p + 1]);
}int ask(int p, int l, int r, int left, int right) {//函数返回[left, right]里面的最大值if (l >= left && r <= right) return trees[p];int mid = (l + r) / 2, a = 0, b = 0;if (mid >= left) a = ask(2 * p, l, mid, left, right);if (mid < right) b = ask(2 * p + 1, mid + 1, r, left, right);return max(a, b);
}build(1, 1, n);

bfs广度优先

前面提到可能有多个局部最大值,我们必须要考虑每一个局部最大值,才能得出最终最大值。

为了快速得出数组里面有多少个局部最大值,我们用哈希表去存每一个值的下标是什么。

unordered_map<int, vector<int>> mp;
for (int i = 1; i <= n; i++) cin >> arr[i], mp[arr[i]].push_back(i);

然后我们开始bfs广度优先

class node{
public:int val, num, index;//val指当前节点的值,num指当前节点应该是第几个数,index表示数组里对应的下标。
};void bfs() {node k, w;k.val = ask(1, 1, n, 1, n - m + 1), k.num = 0;//第一个数的范围是[1, n - m + 1],否则凑不齐m个数queue<node> q;for (int x : mp[k.val]) {if (x > n - m + 1) break;k.index = x;q.push(k);}while(!q.empty()) {k = q.front(), q.pop();if (k.val < tem[k.num]) continue;else tem[k.num] = k.val;if (k.num == m - 1 || k.index + 1 > n || n - (m - k.num - 1) + 1 > n || k.index + 1 > n - (m - k.num - 1) + 1) continue;//下一个数的范围是[k.index + 1, n - (m - k.num - 1) + 1]w.val = ask(1, 1, n, k.index + 1, n - (m - k.num - 1) + 1), w.num = k.num + 1;for (int x : mp[w.val]) {if (x <= k.index) continue;if (x > n - (m - k.num - 1) + 1) break;w.index = x, q.push(w);}}
}
http://www.dtcms.com/wzjs/520248.html

相关文章:

  • 博乐建设工程信息网站抖音推广方案
  • 网站banner怎么居中app广告联盟平台
  • 怎么在服务器上装WordPressseo查询外链
  • 可以做哪些有趣的网站我要软文网
  • 福永网站制作淘宝关键词搜索排行榜
  • 网页布局设计方法seo必备软件
  • 唐山网站制作企业廊坊网络推广优化公司
  • 杭州酒店团购网站建设网站优化塔山双喜
  • 厦门网站怎么做山东网站seo推广优化价格
  • 网页设计中用div做网站例子登封网站建设公司
  • 用dreamweaver做网站seo顾问多少钱
  • 将网站收藏至ie收藏夹怎么做2345网址导航下载桌面
  • wikidot网站怎么做谷歌google play下载
  • 国外做的比较的ppt网站有哪些快速seo关键词优化技巧
  • 大学英语作文网站今日头条官网首页
  • 寻找哈尔滨网站建设关键词营销优化
  • 建立网站需要多少钱网上营销策略有哪些
  • 广州网站建设 seo营销策略4p
  • 说旅游网页设计作业seo81
  • 网站内链建设不可忽视的地方如何推广外贸型网站
  • 哪个网站做批发比较好软文推广模板
  • 可以做哪些网站有哪些免费发布信息的平台有哪些
  • 唐山网站设计制作门户网站怎么做
  • html 网站 模板西安seo引擎搜索优化
  • 京东网站建设百度投流
  • 渭南 网站集约化建设国内免费发布产品的平台
  • 郑州做互联网推广的白杨seo教程
  • pc 手机自适应网站用什么做长沙网络推广营销
  • 做兼职的网站有哪些工作成功的营销案例及分析
  • 晋江网站建设费用百度后台登陆入口