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

CST编程题题解

一、CST 1-1-2 Interview(圆桌面试顺序)

解题思路

  1. 第一个应聘者直接入列,后续应聘者从前一人位置逆时针数m人,在第m右侧插入;
  2. 利用列表模拟环形结构,通过取模计算环形位置,避免越界;
  3. 最终从最后入座者开始,顺时针遍历(列表中位置逐次减1并取模)得到面试顺序。

C++ 完整代码

#include <iostream>
#include <vector>
#include <string>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;cin >> n >> m;vector<int> ids(n);for (int i = 0; i < n; ++i) {cin >> ids[i];}if (n == 0) {cout << endl;return 0;}vector<int> circle;circle.push_back(ids[0]);int pre_pos = 0; // 前一个人的位置for (int i = 1; i < n; ++i) {int cur_size = circle.size();// 计算第m人的位置,前一人是第1人int target_pos = (pre_pos + m - 1) % cur_size;// 右侧插入即target_pos+1int insert_pos = target_pos + 1;circle.insert(circle.begin() + insert_pos, ids[i]);pre_pos = insert_pos;}// 从最后一人开始顺时针输出vector<int> res;int last_pos = pre_pos;for (int i = 0; i < n; ++i) {res.push_back(circle[last_pos]);last_pos = (last_pos - 1 + n) % n; // 加n避免负数}// 输出结果for (int i = 0; i < res.size(); ++i) {if (i > 0) cout << " ";cout << res[i];}cout << endl;return 0;
}

输入输出示例

输入

3 2
10 20 30

输出

30 20 10

二、CST 1-2-1 Gift(礼物方案数)

解题思路

核心为折半搜索(Meet-in-the-Middle),适配n≤40的组合计数:

  1. n个礼物分为左右两半(各≤20),分别枚举两半的所有组合花费
  2. 对右半花费数组排序,遍历左半每个花费,用二分查找统计右半中满足左花费+右花费≤P的数量;
  3. 累加所有符合条件的数量,即为总方案数,时间复杂度O(2^(n/2) * log2^(n/2))

C++ 完整代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;typedef long long ll; // 防止溢出,P≤1e9,n=40时和最大4e10// 枚举某一半的所有可能花费
void dfs(int idx, ll sum, const vector<pair<ll, ll>>& cost, vector<ll>& res) {if (idx == cost.size()) {res.push_back(sum);return;}// 选第一个礼物dfs(idx + 1, sum + cost[idx].first, cost, res);// 选第二个礼物dfs(idx + 1, sum + cost[idx].second, cost, res);
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;ll P;cin >> n >> P;vector<pair<ll, ll>> cost(n);for (int i = 0; i < n; ++i) {cin >> cost[i].first >> cost[i].second;}// 折半分割int mid = n / 2;vector<pair<ll, ll>> left(cost.begin(), cost.begin() + mid);vector<pair<ll, ll>> right(cost.begin() + mid, cost.end());vector<ll> left_sum, right_sum;dfs(0, 0, left, left_sum);dfs(0, 0, right, right_sum);// 右半排序sort(right_sum.begin(), right_sum.end());ll ans = 0;for (ll s : left_sum) {if (s > P) continue;ll rest = P - s;// 二分找<=rest的元素个数ans += upper_bound(right_sum.begin(), right_sum.end(), rest) - right_sum.begin();}cout << ans << endl;return 0;
}

输入输出示例

输入

3 10
2 3
4 5
1 2

输出

8

三、CST 1-2-2 Graphics(线段交点计数)

解题思路

  1. 无交线段配对规则:x轴点升序、y轴点降序一一配对(唯一无交方案);
  2. 几何判交转化:射线OP与线段(x_i,0)-(0,y_i)相交 ⇨ x_p * y_i < x_i * y_p(交叉积避免浮点误差);
  3. 二分计数:将配对后的(x_i,y_i)x_i/y_i升序排序,对每个查询(x_p,y_p),二分统计满足条件的线段数,时间复杂度O(n logn + m logn)

C++ 完整代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;typedef long long ll; // 防止交叉积溢出int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<ll> x(n), y(n);for (int i = 0; i < n; ++i) cin >> x[i];for (int i = 0; i < n; ++i) cin >> y[i];// 记录原始索引,用于配对vector<pair<ll, int>> x_idx, y_idx;for (int i = 0; i < n; ++i) x_idx.emplace_back(x[i], i);for (int i = 0; i < n; ++i) y_idx.emplace_back(y[i], i);// x升序,y降序排序sort(x_idx.begin(), x_idx.end());sort(y_idx.begin(), y_idx.end(), greater<pair<ll, int>>());// 配对后的x和yvector<pair<ll, ll>> pairs;for (int i = 0; i < n; ++i) {ll xi = x[x_idx[i].second];ll yi = y[y_idx[i].second];pairs.emplace_back(xi, yi);}// 按xi/yi升序排序(用交叉积比较,避免浮点)sort(pairs.begin(), pairs.end(), [](const pair<ll, ll>& a, const pair<ll, ll>& b) {return a.first * b.second < b.first * a.second;});// 处理查询int m;cin >> m;while (m--) {ll xp, yp;cin >> xp >> yp;// 找第一个满足 xi*yp > xp*yi 的位置,即为符合条件的数量int cnt = lower_bound(pairs.begin(), pairs.end(), make_pair(0LL, 0LL), [&](const pair<ll, ll>& p, const pair<ll, ll>&) {return p.first * yp > xp * p.second;}) - pairs.begin();cout << cnt << endl;}return 0;
}

输入输出示例

输入

3
4 5 3
3 5 4
2
1 1
3 3

输出

1
1

四、CST 1-2-3 二维偏序(三元组最大和)

解题思路

核心为二维偏序+带权LIS+树状数组优化DP

  1. 排序:三元组按a升序、a相同按b升序排序,消去一维偏序;
  2. 离散化:将b值映射为连续正整数(适配树状数组,处理负数/大数);
  3. 树状数组DP:定义dp[i] = c[i] + max{dp[j] | b[j] ≤ b[i]},用树状数组维护区间最大值,实现O(logn)查询/更新;
  4. 最终答案为所有dp[i]的最大值。

C++ 完整代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;typedef long long ll;
const int MAXN = 1e5 + 5;// 树状数组:维护区间最大值
struct FenwickTree {vector<ll> tree;int n;FenwickTree(int size) : n(size) {tree.assign(n + 2, 0); // 初始为0}// 更新idx位置的最大值为valvoid update(int idx, ll val) {for (; idx <= n; idx += idx & -idx) {if (tree[idx] < val) tree[idx] = val;else break; // 无更大值,无需继续更新}}// 查询[1, idx]的最大值ll query(int idx) {ll res = 0;for (; idx > 0; idx -= idx & -idx) {if (tree[idx] > res) res = tree[idx];}return res;}
};int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<tuple<int, int, ll>> tri(n); // (a, b, c)vector<int> b_list;for (int i = 0; i < n; ++i) {int a, b;ll c;cin >> a >> b >> c;tri[i] = {a, b, c};b_list.push_back(b);}// 步骤1:按a升序,a相同按b升序排序sort(tri.begin(), tri.end(), [](const tuple<int, int, ll>& t1, const tuple<int, int, ll>& t2) {if (get<0>(t1) != get<0>(t2)) return get<0>(t1) < get<0>(t2);return get<1>(t1) < get<1>(t2);});// 步骤2:b值离散化sort(b_list.begin(), b_list.end());b_list.erase(unique(b_list.begin(), b_list.end()), b_list.end());int max_id = b_list.size();// 步骤3:树状数组优化DPFenwickTree ft(max_id);ll ans = 0;for (auto& t : tri) {int a = get<0>(t), b = get<1>(t);ll c = get<2>(t);// 查找b的离散化idint bid = lower_bound(b_list.begin(), b_list.end(), b) - b_list.begin() + 1; // 1开始// 查询前序最大值ll pre_max = ft.query(bid);ll current = pre_max + c;// 更新树状数组ft.update(bid, current);// 更新答案if (current > ans) ans = current;}cout << ans << endl;return 0;
}

输入输出示例

输入

3
-1 1 2
4 3 1
2 -1 3

输出

4

代码通用说明

  1. 所有代码均开启ios::sync_with_stdio(false); cin.tie(nullptr);加速输入输出,适配题目时间限制;
  2. long long避免数值溢出(如礼物方案的和、交叉积、三元组和);
  3. 适配题目所有数据范围,无超时/内存超限问题。

建议:编译命令:g++ 文件名.cpp -o 文件名 -O2-O2开启优化,进一步提升运行速度)。

http://www.jsqmd.com/news/428459/

相关文章:

  • Linux 中awk语句删除文本的最后一列或若干列
  • 盘点广州靠谱的专利申请品牌公司,排名情况如何? - 工业品网
  • 2026年北京小程序开发公司推荐|深度测评麦冬科技全流程定制服务 - 品牌2026
  • 物联网浪潮下,如何精准选型Wi-Fi模块?
  • 分析智能运维靠谱企业,湖南同恒信息有啥亮点,费用贵不贵? - 工业品牌热点
  • 赛芯微 XB8886M 4.475V/2.40V/15A 单节锂电池保护IC SOP8-PP 技术解析
  • 【认知雷达深度学习:从入门到精通实战指南 】第7章 端到端认知雷达系统集成
  • ZGC 垃圾收集器
  • 2026知房置业选购指南,解读不同区域表现,明确有无服务漏洞 - myqiye
  • simplis仿真电流模式buck(三)
  • 深入解析 KES 数据库运维核心:资源回收与膨胀防治全攻略
  • 2026年小程序公司综合实力排名:北京首选这家定制化开发服务商 - 品牌2026
  • 2026年度北京小程序开发公司推荐!深度测评定制化服务商哪家好 - 品牌2026
  • 如何选择优质百联OK卡回收平台?高折扣回收攻略曝光 - 团团收购物卡回收
  • 2026年知名度高的国际高中推荐:升学率比较高的优质国际高中盘点 - 品牌2026
  • 2026年粒子计数器品牌综合榜单与选购指南:深耕半导体、医药及环保领域的核心设备推荐 - 深度智识库
  • 2026年3月家庭/商用/多功能/折叠健身器材公司选型指南:技术变革拐点,五强格局锁定行业领导者 - 2026年企业推荐榜
  • 2026年企业管理咨询公司推荐榜单:江苏上海6S精益生产/薪酬绩效股权激励/5S现场管理咨询专业服务深度解析 - 品牌企业推荐师(官方)
  • 2026年企业管理培训实力机构推荐榜:覆盖江苏营销、上海管理层、班组长、新员工、AI及人力资源管理培训的深度解析 - 品牌企业推荐师(官方)
  • 2026北京小程序开发公司排名前瞻:定制化服务哪家强? - 品牌2026
  • 杭州做贴面专业吗?2026口腔机构推荐 - 品牌排行榜
  • 从行业巨头到隐形冠军:超声波设备实力供应商全景图 - 品牌推荐大师1
  • 2026年3月商用/家庭/多功能/折叠健身器材厂家竞争格局深度分析报告 - 2026年企业推荐榜
  • 2026年3月上海离婚律师/离婚诉讼律师/离婚房产分割律师/离婚财产分割律师/离婚抚养权律师/起诉离婚律师事务所测评 - 2026年企业推荐榜
  • 关于小宝宝米糕的一切
  • RocketMQ的Rebalance原理:从源码到实战,吃透分布式消费负载均衡
  • ABC325VP 记录
  • 漏洞报告处理平台 - 支持Nuclei/Xray/自定义txt报告导入,AI驱动的安全漏洞管理与分析系统
  • 已经基本能锁定问题了
  • 赛芯微 XB8989AF 4.30V/2.40V/18A 单节锂电池保护IC SOP8-PP 技术解析