102400118 林嘉祚 寒假集训第五专题

news/2025/2/13 17:48:01/文章来源:https://www.cnblogs.com/linjiazuo/p/18714095

AC截图:

1、自然数的拆分问题
数据范围很小,直接dfs暴力枚举就行。

#include <iostream>
using namespace std;int n;
int arr[10];void dfs(int x, int sum , int start)
{if (sum > n){return;}if (sum == n && x != 2){for (int i = 1 ; i <= x-1 ; i++){if (i <= x-2){cout << arr[i] << "+";}else{cout << arr[i];}}cout << endl;return;}for (int i = start ; i <= n ; i++){arr[x] = i;dfs(x+1,sum+i,i);}
}int main()
{cin >> n;dfs(1,0,1);
}

2、填涂颜色
本题关键在于找到闭合圈。首先找到第一个1出现的行,下一行第一个1后的0即闭合圈首个元素。将该元素加入队列bfs即可覆盖整个闭合圈。

#include <iostream>
#include <queue>
using namespace std;int g[40][40];
bool st[40][40];
int n;
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};
typedef pair<int,int> PII;void bfs(int x , int y)
{queue<PII> q;q.push({x,y});st[x][y] = true;while (!q.empty()){PII t = q.front();q.pop();for (int i = 0 ; i <= 3 ; i++){int a = t.first + dx[i];int b = t.second + dy[i];if (a < 1 || b < 1 || a > n || b > n) continue;if (st[a][b] == true) continue;if (g[a][b] == 1) continue;st[a][b] = true;q.push({a,b});}}
}int main()
{cin >> n;bool flag1 = false;bool flag2 = false;int x1,y1,x2,y2;for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= n ; j++){cin >> g[i][j];if (flag1 == false && g[i][j] == 1){x1 = i;y1 = j;flag1 = true;}if (flag1 == true && flag2 == false && g[i][j] == 0 && i > x1 && j >= y1){flag2 = true;x2 = i;y2 = j;}}}bfs(x2,y2);for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= n ; j++){if (st[i][j] == false){cout << g[i][j] << " ";}else{cout << 2 << " ";}}cout << endl;}return 0;
}

3、显示图像
从黑点出发找到最近的白点比较麻烦。正难则反,将所有白点加入队列bfs,一定能保证白点首次经过黑点时是最近距离。

#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <math.h>
#include <queue>
using namespace std;typedef pair<int,int> PII;
const int N = 3e4;
string g[N];
vector<int> ans[N];
queue<PII> q;
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};
int n,m;int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n >> m;for (int i = 1 ; i <= n ; i++){string str;cin >> str;str = "0" + str;g[i] = str;}for (int i = 1 ; i <= n ; i++){ans[i].push_back(0);for (int j = 1 ; j <= m ; j++){if (g[i][j] == '0') ans[i].push_back(-1);else{ans[i].push_back(0);q.push({i,j});}}}while (!q.empty()){PII t = q.front();q.pop();for (int i = 0 ; i <= 3 ; i++){int x0 = t.first + dx[i];int y0 = t.second + dy[i];if (x0 < 1 || y0 < 1 || x0 > n || y0 > m) continue;if (ans[x0][y0] != -1) continue;ans[x0][y0] = ans[t.first][t.second] + 1;q.push({x0,y0});}}for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= m ; j++){cout << ans[i][j] << " ";}cout << endl;}
}

4、健康的荷斯坦奶牛
数据范围并不大,可以直接枚举所有情况。需要注意的是,若当前选择饲料数大于等于先前选择的最优解时,直接剪枝。并且由于从1开始进行01枚举,一定能保证最终方案满足字典序最小。

#include <iostream>
using namespace std;const int N = 30;
int v[N],v1[N]; //所需
int res[N],now[N];
int g[N][N];
int n,m;
int ans = 2e9;void dfs(int x , int cnt)
{if (cnt >= ans) return;if (x > m){for (int i = 1 ; i <= n ; i++){v1[i] = 0;for (int j = 1 ; j <= cnt ; j++){int pos = now[j];v1[i] += g[pos][i];}if (v1[i] < v[i]) return;}for (int i = 1 ; i <= cnt ; i++) res[i] = now[i];ans = min(ans,cnt);return;}now[cnt+1] = x;dfs(x+1,cnt+1);dfs(x+1,cnt);
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1 ; i <= n ; i++) cin >> v[i];cin >> m;for (int i = 1 ; i <= m ; i++){for (int j = 1 ; j <= n ; j++){cin >> g[i][j];}}dfs(1,0);cout << ans << " ";for (int i = 1 ; i <= ans ; i++){cout << res[i] << " ";}return 0;
}

5、GRZ-Ridges and Valleys
从一个点开始bfs,找到所有与其高度相等的位置,类似并查集的思想,将它们都指向父节点,构成一个集合。再判断每个集合周围元素是否满足山峰或山谷条件。需要特判当整个图高度都相等的情况。

#include <iostream>
#include <queue>
using namespace std;typedef pair<int,int> PII;
const int N = 1010;
int g[N][N];
int pre[N][N];
int dx[] = {-1,0,1,1,1,0,-1,-1};
int dy[] = {1,1,1,0,-1,-1,-1,0};
queue<PII> q;
int n,ans1,ans2,cnt;void bfs(int x , int y)
{q.push({x,y});pre[x][y] = cnt;bool flag1 = false; //更低bool flag2 = false; //更高while (!q.empty()){PII t = q.front();q.pop();for (int i = 0 ; i <= 7 ; i++){int x0 = t.first + dx[i];int y0 = t.second + dy[i];if (x0 < 1 || y0 < 1 || x0 > n || y0 > n) continue;if (pre[x0][y0] == pre[x][y]) continue;if (g[x0][y0] == g[t.first][t.second]){pre[x0][y0] = cnt;q.push({x0,y0});}else if (g[x0][y0] > g[t.first][t.second]) flag2 = true;else flag1 = true;}}if (flag1 && !flag2) ans1++;if (flag2 && !flag1) ans2++;return;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;bool flag = true; //全部相同int f = 0;for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= n ; j++){cin >> g[i][j];if (flag){if (i == 1 && j == 1) f = g[i][j];else{if (g[i][j] != f) flag = false;}}}}if (flag){cout << 1 << " " << 1 << endl;return 0;}for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= n ; j++){if (!pre[i][j]){cnt++;bfs(i,j);}}}cout << ans1 << " " << ans2 << endl;
}

6、八皇后
本题要求每行每列只有一个棋子很好处理,难点在于对角线。利用主副对角线索引的性质,可以用一个数表示一条对角线。易知,主对角线上x-y为定值,副对角线上x+y为定值。用该定值表示一条对角线即可。剩下的就是dfs枚举每个合法的位置。

#include <iostream>
using namespace std;int cnt = 0;
int n;
int arr[20];
bool st[20]; // 每列状态
bool diag1[40]; // 主对角线
bool diag2[40]; // 副对角线void dfs(int x) {if (x > n) {cnt++;if (cnt <= 3) {for (int i = 1; i <= n; i++) {cout << arr[i] << " ";}cout << endl;}return;}for (int i = 1; i <= n; i++) {if (!st[i] && !diag1[x - i + n] && !diag2[x + i]) {arr[x] = i;st[i] = true;diag1[x - i + n] = true; // 主对角线diag2[x + i] = true; // 副对角线dfs(x + 1);st[i] = false;diag1[x - i + n] = false;diag2[x + i] = false;}}
}int main() {cin >> n;dfs(1);cout << cnt << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/883309.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线网校教育软件开发助力互联网时代教育发展

互联网时代,在线教育已成为推动教育事业发展的重要力量。开发优质的在线网校教育软件,能够有效整合资源、提升效率、促进公平,为教育发展注入新活力。以下是关键点: 一、 在线网校教育软件的优势 打破时空限制: 学生可随时随地学习,充分利用碎片化时间,提升学习效率。 优…

算法备案材料填报攻略

算法备案攻略本算法备案资料使用说明 算法备案材料涉及众多内容,其中以《自评估报告》最为复杂。为方便大家了解,特提供了下面的参考填写内容。注:算法备案自评估报告涉及160多个审核要素,每个算法的实际情况都不相同,以下内容仅供学习了解。如果有实际申报需求,建议咨询…

WPS Office for Mac 7.2.0 - 写作、表格处理、PPT 制作和 PDF 编辑

WPS Office for Mac 7.2.0 - 写作、表格处理、PPT 制作和 PDF 编辑WPS Office for Mac 7.2.0 - 写作、表格处理、PPT 制作和 PDF 编辑 Smarter, Faster, Easier, Free with Seamless MS Office Compatibility 请访问原文链接:https://sysin.org/blog/wps-for-mac-7/ 查看最新版…

Microsoft Office LTSC 2024 for Mac (Microsoft 365) 16.94 - 文档、电子表格、演示文稿和电子邮件

Microsoft Office LTSC 2024 for Mac (Microsoft 365) 16.94 - 文档、电子表格、演示文稿和电子邮件Microsoft Office LTSC 2024 for Mac (Microsoft 365) 16.94 - 文档、电子表格、演示文稿和电子邮件 Office LTSC 2024 for Mac (Word, Excel, PowerPoint, Outlook + OneNote,…

配置文件密文存储敏感信息服务启动流程设计

start() {# ()创建子进程(flock -x 200 # 200 文件描述符,进程级别的。ctl_n=$(ps -fu ${USER} | grep xxx start | grep -v grep | grep -v "$$" | wc -l) # grep -v "$$" 过滤掉当前进程if [ ${ctl_n} -gt 1 ]; thenecho -e "Exist kafka_ctl is…

Failed to load module script Expected a JavaScript module script 解决方案

部署若依前端vue3到云服务器的时候,一直在转圈圈加载中,最后排查出来是vite打包的时候的一个设置出错了 按照下图的加一个点即可解决。本文来自博客园,作者:程序员鲜豪,转载请注明原文链接:https://www.cnblogs.com/hg-blogs/p/18714033

内测之家-安全机制-签名(一)

API 加签的意义身份验证:在网络交互中,服务器需要确定请求的来源是否可靠。通过对请求进行加签,服务器可以验证请求是否来自合法的客户端。客户端使用独特的密钥进行签名操作,服务器能够依据已知的密钥信息对签名进行校验,只有签名验证通过,才能确认请求源自合法身份,有…

支付宝 IoT 设备入门宝典(上)设备管理篇

相信不少朋友最近都被支付宝“碰一下”广告刷屏,“不用打开APP 支付就碰一下”几个字一出简直自带BGM……其实“碰一下”就是支付宝 IoT 设备的一种,趁着热度还在,我会分为设备管理和设备经营上下两篇,简单介绍一下支付宝 IoT,以及在日常使用管理中的常见问题解决方案,本…

【贪心】区间问题

最大不相交区间数量 演唱会、计算最多能观看几场演出样例1 输入 2 720 120 840 120输出 1样例2 输入 2 0 60 75 60输出 2C++代码 // Problem: #OD268. 演唱会、计算最多能观看几场演出 // Contest: Hydro // Memory Limit: 256 MB // Time Limit: 1000 ms // 区间问题:求最大不…

第五讲 搜索算法

第一题 自然数的拆分思路: 1.通过递归的方式将每个数从1开始拆分 2.每次拆分的后一个数大于等于前一个数,确保拆分结果不重复第二题 填涂颜色思路: 1.将外圈的0也都围成圈 2.只需将剩下的0变成2第三题 显示图像AC代码:第四题 健康的荷斯坦奶牛AC代码:

vxe-table 展开行的使用,子表复杂渲染,解决固定列与展开行重复渲染问题

vxe-table 展开行的使用,子表复杂渲染,解决固定列与展开行重复渲染问题,需要注意最新版本才支持 官网:https://vxetable.cn 同时支持虚拟滚动和展开行与固定列、子表复杂渲染,需要注意最新版本才支持使用 <template><div><vxe-grid v-bind="gridOptio…

【重磅发布】 免费领取阿里云百炼AI大模型100万Tokens教程出炉,API接口实战操作,DeepSeek-R1满血版即刻体验!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注什么是阿里云百炼? 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。 不论是开发者…