尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

牛客刷题-Day21

牛客刷题-Day21
📅 发布时间:2026/6/20 5:27:04
模拟、枚举与贪心 https://ac.nowcoder.com/acm/contest/20960?from=acdiscuss

牛客刷题-Day21

今日刷题:\(1031-1035\)

1031 贪心 · 例10-Bits

6ed536a2-e2e0-42f2-8615-35a13ac853b6

解题思路

贪心。假设开始每一位都是 \(1\),从高位 \(i\) 开始枚举,如果当前数 \(>r\),且减去 \(1<<i\) 后仍 \(>=l\),就减 \(1<<i\)。当当前数在 \([l,r]\) 之间时,输出。
因为从高位开始减,所以保证当前数是最小的。
参考:Codeforces Round #276 (Div. 1) A. Bits

C++ 代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 70;int T;
LL bit[N];int main() {scanf("%d", &T);bit[0] = 1;for (int i = 1; i <= 60; i++)bit[i] = bit[i - 1] * 2;while (T--) {LL l, r;scanf("%lld%lld", &l, &r);LL res = ((LL) 1 << 61) - 1;for (int i = 60; i >= 0; i--) {if (res > r && res - bit[i] >= l)res -= bit[i];if (res >= l && res <= r)break;}printf("%lld\n", res);}return 0;
}

1032 贪心 · 例11-毒瘤xor

6d9c46b1-b2cb-4849-b903-77d008a9548f

解题思路

异或运算每一位是独立的,因此,对于每一位,统计该区间内所有数在该位的 \(0\) 和 \(1\) 的个数。
因为要在异或操作之后保留更多的 \(1\),因此对于 \(x\) 的对应位,如果 \(1\) 多则取 \(0\),反之取 \(1\)。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 100010, M = 35;
typedef long long LL;int n, q;
int a[N], s[N][M]; // s[i][j] 表示前 i 个数第 j 位 1 的个数int main() {scanf("%d", &n);for (int i = 1; i <= n; i++)scanf("%d", &a[i]);for (int i = 1; i <= n; i++) {for (int j = 0; j <= 30; j++)s[i][j] = s[i - 1][j] + ((a[i] >> j) & 1);}scanf("%d", &q);while (q--) {int l, r, res = 0;scanf("%d%d", &l, &r);for (int j = 0; j <= 30; j++) {if (2 * (s[r][j] - s[l - 1][j]) <= r - l + 1)res |= 1 << j;}printf("%d\n", res);}return 0;
}

1033 贪心 · 例12-兔子的区间密码

fce07855-2288-4f2b-a7a1-f30ffd49d448

解题思路

对于区间端点 \(l\) 和 \(r\),按位来遍历,如果高位都相同,那么高位是无法改变的,继续遍历,只要某位开始不同,那么异或的结果就是这一位往低位都可以变为全 \(1\)。
假设前 \(k\) 位相同,第 \(k+1\) 位不同。

注意:第 \(k+1\) 位不同,则 \(l\) 的 \(k+1\) 位必然为 \(0\),\(r\) 的 \(k+1\) 位必然为 \(1\)。如果反之,则 \(l\) 为 \(xxx1aaa\),\(r\) 为 \(xxx0bbb\),很明显 \(l>r\)。

\(l\) 的从 \(k+2\) 位到最后都可以取到 \(1\),这样得到的数必然大于等于 \(l\);\(r\) 的从 \(k+2\) 位到最后都可以取到 \(0\),这样得到的数必然小于等于 \(r\)。这样得到的两个数存在 \(k+1\) 到最低位都不同,异或之后值最大。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;int T;void solve(LL l, LL r) {for (int i = 63; i >= 0; i--) {if ((l >> i) == (r >> i))continue;printf("%lld\n", ((LL) 1 << (i + 1)) - 1);return;}printf("0\n");
}int main() {scanf("%d", &T);while (T--) {LL l, r;scanf("%lld%lld", &l, &r);solve(l ,r);}return 0;
}

1034 贪心 · 例13-起床困难综合征

507ce874-05fe-4e93-8681-d0fc1a77d511

解题思路

取 \(a=0\) 和 \(b=-1\) 进行一边操作,这样就可以得到每一位在初始为 \(0\) 或者 \(1\) 经过操作得到的结果。
因为初始攻击力要在 \([0,m]\) 之间,因此每一位可以从 \(0\) 经过操作得到 \(1\),则该位优先取 \(0\);否则取 \(1\),并计算剩余可用值(范围限制)。
因为要保证答案最大,因此从高位开始遍历。

for (int j = 29; j >= 0; j--) {if ((a >> j) & 1)res += (1 << j);else if ((b >> j) & 1 && ((1 << j) <= m))res += (1 << j), m -= (1 << j);
}

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;int n, m, t;
string op;int main() {int a = 0, b = -1;cin >> n >> m;for (int i = 1; i <= n; i++) { // 每一位为 0 或者 1 进行操作cin >> op >> t;if (op == "OR") {a |= t, b |= t;} else if (op == "XOR") {a ^= t, b ^= t;} else {a &= t, b &= t;}}int res = 0;for (int j = 29; j >= 0; j--) {if ((a >> j) & 1)res += (1 << j);else if ((b >> j) & 1 && ((1 << j) <= m))res += (1 << j), m -= (1 << j);}cout << res << endl;return 0;
}

1035 习题-[NOIP2017]时间复杂度

解题思路

首先判断循环是否可执行:

  • 如果 \(x=n\):\(y=n\),为 \(O(1)\);\(y\) 为常数,无法执行;
  • 如果 \(y=n\):\(x\) 为常数,为 \(O(n^1)\);
  • 如果 \(x\) 和 \(y\) 都为常数,且 \(x\le y\),为 \(O(1)\)。

当输入为循环开始语句,判断变量是否已声明,已声明为 \(ERR\),否则(当前循环判断值为 \(t\)):

  • 栈为空:当前不存在嵌套循环,上述判断的值直接入栈,可更新答案 \(res=max(res,t)\);
  • 栈不空:当前存在嵌套循环,判断外层循环是否可执行,若外层不可执行或者当前循环不可执行,则 \(-1\) 入栈;否则 \(top+t\) 入栈,可更新答案 \(res=max(res,t+top)\)。

当输入为循环结束语句:

  • 栈为空:不合法。
  • 栈不空:栈顶弹出,变量弹出,一个循环结束。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 110;int T, L;
string complexity, loop[N];int get(string x, string y) {if (x == "n" && y == "n") return 0;else if (x == "n") return -1;else if (y == "n") return 1;else if (stoi(x) <= stoi(y)) return 0;else return -1;
}string calc(int L) {int res = 0;stack<int> stk;string vars;for (int i = 0; i < L; i++) {auto &s = loop[i];if (s[0] == 'F') {char var[2], x[4], y[4];sscanf(s.c_str(), "F %s %s %s", var, x, y);if (vars.find(var) != -1)return "ERR";vars += var;int t = get(x, y);if (stk.empty()) {stk.push(t);res = max(res, t);} else {int top = stk.top();if (top == -1 || t == -1)stk.push(-1);else {stk.push(top + t);res = max(res, top + t);}}} else {if (stk.empty())return "ERR";stk.pop();vars.pop_back();}}if (stk.size()) return "ERR";if (!res) return "O(1)";return "O(n^" + to_string(res) + ")";
}int main() {cin >> T;while (T--) {cin >> L >> complexity;getchar();for (int i = 0; i < L; i++)getline(cin, loop[i]);string res = calc(L);if (res == "ERR")cout << res << endl;else if (res == complexity)cout << "Yes" << endl;elsecout << "No" << endl;}return 0;
}

本文来自博客园,作者:Cocoicobird,转载请注明原文链接:https://www.cnblogs.com/Cocoicobird/p/19210995

相关新闻

  • 恒利泰射频器件:国产穿心电容、高Q电容、馈通滤波器
  • LLM大模型原理与实践 学习笔记 - yi
  • 183天基于资源的约束委派

最新新闻

  • CSP实战指南:从HTTP头配置到React/Vite安全加固
  • 2026年热门的公司注册/海口贸易公司注册/海口科技公司注册实力推荐 - 品牌宣传支持者
  • 2026年知名的江苏DM542型电机驱动器/无刷电机驱动器/江苏BLD300型电机驱动器/江苏无刷电机驱动器定制加工厂家推荐 - 行业平台推荐
  • 后端开发新趋势:探索前沿技术栈的融合应用
  • 2026新余漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 基于分层智能体架构的AI模型自动化构建系统设计与实践

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号