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

算法 —— 暴力枚举

目录

循环枚举

P2241 统计方形(数据加强版)

P2089 烤鸡

P1618 三连击(升级版)

子集枚举

P1036 [NOIP2002 普及组] 选数

P1157 组合的输出

排列枚举 

P1706 全排列问题

P1088 [NOIP2004 普及组] 火星人


循环枚举

顾名思义,通过for循环或者while循环枚举所有可能方案。 

P2241 统计方形(数据加强版)

很显然这是一道找规律的题目:正方形和长方形的唯一区别在于长宽是否相等,根据此条件可以统计矩形个数,先研究规律:

	for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)

首先是横着的长方形,宽始终为1,长不断发生改变,可以看出长为2的时候,第一行个数为6个,总共有6 x 6个,长为3的时候,总共有6 x 5个……以上述循环条件来看可以得出一个规律:

长发生变化后的矩形总个数为m * ( n - j + 1)个。

第二看纵向宽发生改变,长重置为1,长为1,宽为2的时候,第一行个数为7个,总共有5 x 7 个,长为2,宽为2的时候 第一行个数为6个,共有5 x 6个……综上所述,可以得出普遍规律:
( m - i + 1) * ( n - j + 1)为每次发生长变化或者宽变化的矩形总个数,又因为长方形与正方形唯一区别是长宽是否相等,因此代码如下:

#include<iostream>
using namespace std;
int main()
{int n, m; cin >> n >> m;long count1 = 0, count2 = 0;for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)if (i == j)count1 += (m - i + 1) * (n - j + 1);elsecount2 += (m - i + 1) * (n - j + 1);cout << count1 << ' ' << count2 << endl;return 0;
}

P2089 烤鸡

 暴力枚举,用十个循环解决此问题,注意:n如果小于10或者大于30直接输出0即可,原因是十种配料之和最小为10,最大为30。

#include <iostream>
using namespace std;int main()
{int n, count = 0; cin >> n;if (n < 10 || n > 30){cout << 0 << endl;return 0;}else{for (int a = 1; a <= 3; a++)for (int b = 1; b <= 3; b++)for (int c = 1; c <= 3; c++)for (int d = 1; d <= 3; d++)for (int e = 1; e <= 3; e++)for (int f = 1; f <= 3; f++)for (int g = 1; g <= 3; g++)for (int h = 1; h <= 3; h++)for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)if (a + b + c + d + e + f + g + h + i + j == n)count++;cout << count << endl;for (int a = 1; a <= 3; a++)for (int b = 1; b <= 3; b++)for (int c = 1; c <= 3; c++)for (int d = 1; d <= 3; d++)for (int e = 1; e <= 3; e++)for (int f = 1; f <= 3; f++)for (int g = 1; g <= 3; g++)for (int h = 1; h <= 3; h++)for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)if (a + b + c + d + e + f + g + h + i + j == n)cout << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << ' ' << f << ' ' << g << ' ' << h << ' ' << i << ' ' << j << ' ' << endl;}return 0;
}

P1618 三连击(升级版)

 本人比较喜欢用stl接口,下面附上代码,注意:输入123,456,789,输出123,456,789

#include<bits/stdc++.h>
using namespace std;int a, b, c, t1, t2, t3; string def;int main()
{cin >> a >> b >> c;for (int i = 1; i <= 1000 / c; i++) //记得从1开始  原因:123,456,789满足{t1 = i * a; t2 = i * b; t3 = i * c;string s1 = to_string(t1), s2 = to_string(t2), s3 = to_string(t3);string tmp; tmp += s1; tmp += s2; tmp += s3;sort(tmp.begin(), tmp.end()); //排序auto it = unique(tmp.begin(), tmp.end()); //去重操作tmp.resize(distance(tmp.begin(), it)); //计算两个迭代器之间的距离if (tmp.size() == 9 && tmp[0] == '1'){cout << s1 << ' ' << s2 << ' ' << s3 << endl;def = tmp;}}if(def.size()==0) //空的说明都不满足cout << "No!!!" << endl;return 0;
}

子集枚举

P1036 [NOIP2002 普及组] 选数

这是一道简单的模拟题,枚举出所有可能情况,不会超过规定时间的,以下附上k<=3的代码,如果需要更大的k,继续仿照写即可。

#include <bits/stdc++.h>
using namespace std;int n, k;bool is_prinum(int x)
{for (int i = 2; i <= sqrt(x); i++)if (x % i == 0)return false;return true;
}int main()
{cin >> n >> k;vector<int> arr(n), pri;for (int i = 0; i < n; i++)cin >> arr[i];int count = 0;for (int i = 0; i < n; i++){int tmp = arr[i];if (is_prinum(tmp) && k == 1)count++;if (k == 1)continue;for (int j = i + 1; j < n; j++){int tmp = arr[i] + arr[j];if (is_prinum(tmp) && k == 2)count++;if (k == 2)continue;for (int z = j + 1; z < n; z++){int tmp = arr[i] + arr[j] + arr[z];if (is_prinum(tmp) && k == 3)count++;if (k == 3)continue;}}}cout << count << endl;return 0;
}

P1157 组合的输出

与上面一题类似,也是求子集,直接for循环叠加:,下面只举例到3:

#include <bits/stdc++.h>
using namespace std;int n, k;int main()
{cin >> n >> k;vector<string> arr(n), ans;for (int i = 0; i < n; i++)arr[i] = to_string(i + 1);for (int i = 0; i < n; i++){if (k == 1){cout << setw(3) << stoi(arr[i]) << endl;continue;}for (int j = i + 1; j < n; j++){if (k == 2){cout << setw(3) << arr[i] << setw(3) << arr[j] << endl;continue;}for (int z = j + 1; z < n; z++){if (k == 3){cout << setw(3) << arr[i] << setw(3) << arr[j] << setw(3) << arr[z] << endl;continue;}}}}return 0;
}

排列枚举 

P1706 全排列问题

本题可以点击此链接看我另一篇文章,其中解释了如何使用stl库的函数解决该问题。


P1088 [NOIP2004 普及组] 火星人

本题不过多赘述,与上题一样也是stl的使用,以下为代码:

#include<bits/stdc++.h>
using namespace std;int main()
{int n, m; cin >> n >> m;vector<int> arr(n);for (int i = 0; i < n; i++)cin >> arr[i];for (int j = 1; j <= m; j++)next_permutation(arr.begin(), arr.end());for (auto e : arr)cout << e << ' ';return 0;
}

相关文章:

  • Godot入门 04平台设计
  • UE4-构建光照后导入的静态网格体变黑
  • c++中的scanf
  • Midjourney绘画提示词精选
  • 使用 nmcli 管理网络连接
  • 【Python机器学习】决策树的构造——信息增益
  • 网络安全自学从入门到精通的制胜攻略!!!
  • 【调色板软件】免费、开源的调色板软件,焰火十二卷,提供了多种功能来生成一组调和色彩NO.108
  • vue3+vite 实现动态引入某个文件夹下的组件 - glob-import的使用
  • Unity UGUI 之 自动布局组件
  • 【Linux】进程信号 --- 信号处理
  • ResNet学习笔记
  • [数据集][目标检测]躺坐站识别检测数据集VOC+YOLO格式9488张3类别
  • 直线与曲线的交点
  • 要是项目从jdk8完全迁移到jdk21难度大吗
  • 2017-08-04 前端日报
  • HTML5新特性总结
  • java小心机(3)| 浅析finalize()
  • Netty源码解析1-Buffer
  • use Google search engine
  • Vue2.0 实现互斥
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 关于字符编码你应该知道的事情
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 你真的知道 == 和 equals 的区别吗?
  • 前嗅ForeSpider教程:创建模板
  • 入手阿里云新服务器的部署NODE
  • 数据可视化之 Sankey 桑基图的实现
  • 一些关于Rust在2019年的思考
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • #pragma data_seg 共享数据区(转)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (十)c52学习之旅-定时器实验
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四) 虚拟摄像头vivi体验
  • (学习日记)2024.01.09
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)树状数组
  • .net 7 上传文件踩坑
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • /usr/bin/env: node: No such file or directory
  • @private @protected @public
  • @staticmethod和@classmethod的作用与区别
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [android] 天气app布局练习
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [BZOJ 1040] 骑士
  • [C/C++入门][ifelse]20、闰年判断