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

建站公司专业地址海淘直邮购物网站

建站公司专业地址,海淘直邮购物网站,苏州专业网站设计,超级外链工具源码牛客周赛 Round 81 E.建筑入门 知识点:完全背包,完全背包的路径转移以及回溯 由题意可以推导出,下层麻将的数字一定大于上层数字,所以我们可以假设一个最基础的麻将塔,也就是: 1 2 2 3 3 3 … 形如这样的&…

牛客周赛 Round 81 E.建筑入门

在这里插入图片描述

  • 知识点:完全背包,完全背包的路径转移以及回溯

由题意可以推导出,下层麻将的数字一定大于上层数字,所以我们可以假设一个最基础的麻将塔,也就是:
1
2 2
3 3 3

形如这样的,然后再从下往上一层一层加数字,且得保证下层一定得大于上层,所以可以想象成,如果倒数第二层加数字的话,倒数第一层也得加数字,那就可以翻译成 选择一个从第i层向下的后缀层数,每一层每一个块均+1,然后选择若干这样的后缀和,最后使得总值正好等于k。

这也就是转化成了一个经典的完全背包问题。
f[i][j] 表示 前i个数字里面选择之后数字和恰好为j能否做到,记录的是一个bool类型的值

但是还有个问题:如何记录路径?
学过01背包的小伙伴肯定都知道01背包记录路径的方法,只需要记录选择了哪件物品即可,但是介于完全背包每个物品可以选择很多件,所以不能单单记录选择了哪件物品,这就需要记录我们的背包体积是什么时候发生变化的。

vector<PII> path(k + 1);  // 记录一下当前体积为 i 的上一步体积是多少

一些回溯包括其他的细节大家参考代码理解吧

#include<bits/stdc++.h>using namespace std;
using i64 = long long;
using u64 = unsigned long long;#define int long long
#define debug(x) cerr << #x" = " << x << '\n';typedef pair<int, int> PII;const i64 N = 2e5 + 10, INF = 1e18 + 10;void solve()
{int n, k;cin >> n >> k;k = k - n * (n + 1) * (2 * n + 1) / 6;  // 1^1 + 2^2 + 3^3 + ... + n^nif (k < 0) {cout << -1 << endl;return;}vector<int> a(n + 2);for (int i = n; i > 0; i--) {a[i] = a[i + 1] + i;}vector<vector<int>> f(n + 1, vector<int>(k + 1, 0));  // 前i个数字里面选择之后数字和恰好为j能否做到vector<PII> path(k + 1);  // 记录一下当前体积为 i 的上一步体积是多少f[0][0] = 1;for (int i = 1; i <= n; i++) {  // (以倒数第n行为开始的后缀)(倒数第n - 1行开始的)。。for (int j = 0; j <= k; j++) {f[i][j] = f[i - 1][j];if (j - a[i] >= 0 && f[i][j - a[i]]) {f[i][j] = 1;path[j] = {j - a[i], i};// 体积为 j 的上一步是 j - a[i];// 把第i号物品拿过来之后进行的转移}}}if (!f[n][k]) {cout << -1 << endl;return;}vector<int> nums;int curr = k;while(curr > 0) {auto [pre, x] = path[curr];nums.emplace_back(x);curr = pre;}vector<int> ans(n + 1, 0);for (auto &x : nums) {ans[x]++;}for (int i = 1; i <= n; i++) {ans[i] += ans[i - 1];}for (int i = 1; i <= n; i++) {ans[i] += i;cout << ans[i] << " \n"[i == n];}
}signed main()
{cin.tie(nullptr) -> ios::sync_with_stdio(false);int T = 1;// cin >> T;while (T --) solve();return 0;
}

牛客周赛 Round 86 E 小苯的Polygon

在这里插入图片描述

  • 知识点:01背包,状态能否成功表示

本来都已经想到状态表示了,结果转移觉得写起来不太对劲就放弃了。

f [ i ] [ j ] f[i][j] f[i][j] 表示 从前i个木棍中选择,多边形的边长为 j 的这种方案可行不可行.

经典01背包转移,但是有一个问题,如何保证所选的木棍一定能构成一个多边形呢?

首先我们可以发现一个性质,能构成多边形的木棍一定满足最长的木棍的长度大于所有其他木棍的长度之和,满足这个条件的已经就可以构成多边形。

所以我们在转移的时候,要先枚举a[i] 作为最大值,然后从 a[i] ~ Max(相当于枚举其余木棍的和)进行转移,只有这样,才能满足构成多边形的条件。

为了保证 a[i] 都是最大值,我们选择排序之后枚举。

但是还有一个问题,就是会不会存在类似于只有两个木棍,满足上述条件,然后进行了错误转移呢??(考虑会不会存在木棍少,构不成多边形的情况)。

答案是不会,因为我们排完序后,前面的木棍长度一定严格小于后面,所以 a[i] ~ Max 这个集合中一定都是大于等于2个木棍的情况。
譬如 1 2 3, 我们呢发现对于这种情况,枚举到 3 的时候前缀和只有 3,则不能进行转移。

void solve()
{int n;cin >> n;vector<int> a(n + 1);int Max = -1;for (int i = 1; i <= n; i++) cin >> a[i], Max = max(a[i], Max);sort(a.begin() + 1, a.end());vector<vector<int>> f(n + 1, vector<int>(n * Max + 1, 0));int ans = INF;f[0][0] = 1;for (int i = 1; i <= n; i++) {for (int j = a[i] + 1; j <= n * Max; j++) {if (f[i - 1][j]) {ans = min(ans, a[i] + j);break;}}f[i] = f[i - 1];for (int j = a[i]; j <= Max * n; j++) {f[i][j] |= f[i - 1][j - a[i]];}}// for (int i = 1; i <= n; i++) {// 	for (int j = 1; j <= Max * n; j ++) {// 		cout << f[i][j] << ' ';// 	}// 	cout << endl;// }if (ans > 1e17) ans = -1;cout << ans << endl;
}

文章转载自:

http://5uIcotJi.gnkdp.cn
http://X9UnJtuH.gnkdp.cn
http://jPd9VJfx.gnkdp.cn
http://wl7PqtvM.gnkdp.cn
http://yLSxgLWN.gnkdp.cn
http://Q2y1tvxz.gnkdp.cn
http://nUOERCDl.gnkdp.cn
http://IqSYsM1C.gnkdp.cn
http://BXyedxSO.gnkdp.cn
http://4rLLnHna.gnkdp.cn
http://ZOHne2yU.gnkdp.cn
http://oIUe1J33.gnkdp.cn
http://yajvhLpB.gnkdp.cn
http://H7Jld4UP.gnkdp.cn
http://ihrJSSLc.gnkdp.cn
http://haLKU4h3.gnkdp.cn
http://n3BBarSz.gnkdp.cn
http://3RiaUDjo.gnkdp.cn
http://JMYbSTL0.gnkdp.cn
http://ZZYAAtDj.gnkdp.cn
http://fPAH4csk.gnkdp.cn
http://OPibeL2a.gnkdp.cn
http://XfHfXc27.gnkdp.cn
http://cZYZvgXU.gnkdp.cn
http://felIyYOw.gnkdp.cn
http://3ud2KxD0.gnkdp.cn
http://gWx7dwjE.gnkdp.cn
http://l4NkSZXs.gnkdp.cn
http://8yJ4wBkG.gnkdp.cn
http://tTLijCmH.gnkdp.cn
http://www.dtcms.com/wzjs/714245.html

相关文章:

  • 建个企业网站备案需要多长时间做网站推广哪个好
  • 专业的咨询行业网站制作弹幕播放器 wordpress
  • 网站建设推广安徽wordpress账号登录界面
  • 珠海网站建设设计团队网站怎么做
  • 广州哪个大学做网站制作好些的建设工程合同分类有哪些
  • 银川微信网站制作长沙网站优化厂家
  • 手机网站建设事项网站开发的后台开发工具
  • gta5中正在建设的网站做网站是要写代码的吗
  • 网站标题logo修改代码泉州做网站工作室
  • 塑料模板多少钱一平方海南seo
  • 做音乐网站网站建设的目的与意义是什么
  • 南京企业网站制作哪家好网站域名如何使用方法
  • 优惠券网站要怎么做玉石电商网站建设方案
  • 浏阳网站建设淄博铺无忧网络科技有限公司
  • 整站优化关键词推广低代码无代码开发平台
  • 做平台网站怎么做佛山做网站制作
  • 咸阳网站建设seo温州市网页制作项文静
  • 明星个人网站建设方案珠海互联网平台
  • 专做智能化施工的网站北京海淀区居家办公
  • 哈尔滨悦创网络科技网站开发wordpress会员收费注册
  • 网站门户设计新生活cms订货系统下载
  • 怎么自己做直播网站吗宣城市建设银行网站首页
  • 湖南易图做推广送网站plc编程软件
  • 中国建设银行驻莫斯科网站网络营销方式多元化
  • 开源门户网站建设方案建设银行招标网站
  • 中地海外路桥建设有限公司网站中文编程
  • 郑州网站建设公司谷雨什么网站下载素材做图的
  • 微信网站如何开发怎么用php安装wordpress
  • 石家庄的网站建设公司中国建设银行积分兑换网站
  • wordpress musikseo比较好的优化方法