暴力枚举

news2024/11/16 19:45:34

文章目录

  • 循环枚举
    • 统计方形加强版
    • 烤鸡
    • 三连击升级版
  • 子集枚举
    • 选数
    • 组合的输出
  • 排列枚举
    • 三连击升级版
    • 全排列问题
    • 火星人
  • [NOIP2004 普及组] 火星人
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1

在这里插入图片描述

循环枚举

统计方形加强版

题目背景

1997年普及组第一题

题目描述

有一个 n × m n \times m n×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。

输入格式

一行,两个正整数 n , m n,m n,m n ≤ 5000 , m ≤ 5000 n \leq 5000,m \leq 5000 n5000,m5000)。

输出格式

一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。

样例 #1

样例输入 #1

2 3

样例输出 #1

8 10
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;

int main( ){
    LL n,m,squ=0,rec=0;
    cin>>n>>m;
    for(int a=1;a<=min(n,m);a++){
        squ+=(n-a+1)*(m-a+1);
    }
    rec = n*(n+1)*m*(m+1)/4-squ;
    cout<<squ<<" "<<rec;
}

烤鸡

题目背景

猪猪 Hanke 得到了一只鸡。

题目描述

猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 10 10 10 种配料(芥末、孜然等),每种配料可以放 1 1 1 3 3 3 克,任意烤鸡的美味程度为所有配料质量之和。

现在, Hanke 想要知道,如果给你一个美味程度 n n n ,请输出这 10 10 10 种配料的所有搭配方案。

输入格式

一个正整数 n n n,表示美味程度。

输出格式

第一行,方案总数。

第二行至结束, 10 10 10 个数,表示每种配料所放的质量,按字典序排列。

如果没有符合要求的方法,就只要在第一行输出一个 0 0 0

样例 #1

样例输入 #1

11

样例输出 #1

10
1 1 1 1 1 1 1 1 1 2 
1 1 1 1 1 1 1 1 2 1 
1 1 1 1 1 1 1 2 1 1 
1 1 1 1 1 1 2 1 1 1 
1 1 1 1 1 2 1 1 1 1 
1 1 1 1 2 1 1 1 1 1 
1 1 1 2 1 1 1 1 1 1 
1 1 2 1 1 1 1 1 1 1 
1 2 1 1 1 1 1 1 1 1 
2 1 1 1 1 1 1 1 1 1

提示

对于 100 % 100\% 100% 的数据, n ≤ 5000 n \leq 5000 n5000

三连击升级版

三连击(升级版)

题目描述

1 , 2 , … , 9 1, 2,\ldots, 9 1,2,,9 9 9 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A : B : C A:B:C A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!

//感谢黄小U饮品完善题意

输入格式

三个数, A , B , C A,B,C A,B,C

输出格式

若干行,每行 3 3 3 个数字。按照每行第一个数字升序排列。

样例 #1

样例输入 #1

1 2 3

样例输出 #1

192 384 576
219 438 657
273 546 819
327 654 981

提示

保证 A < B < C A<B<C A<B<C


upd 2022.8.3 \text{upd 2022.8.3} upd 2022.8.3:新增加二组 Hack 数据。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

int b[10];

void go(int x) {
    b[x % 10] = 1;
    b[x / 10 % 10] = 1;
    b[x / 100] = 1;
}

bool check(int x, int y, int z) {
    memset(b, 0, sizeof(b));
    if (y > 999 || z > 999) return false;
    go(x), go(y), go(z);
    for (int i = 1; i <= 9; i++) {
        if (!b[i]) return false;
    }
    return true;
}

int main() {
    long long A, B, C, x, y, z, cnt = 0;
    cin >> A >> B >> C;
    if(!A||!B||!C){
        puts("No!!!");
        return 0;
    }
    for (x = 123; x <= 987; x++) {
        if (x * B % A || x * C % A) continue;
        y = x * B / A;
        z = x * C / A;
        if (check(x, y, z)) {
            printf("%lld %lld %lld\n", x, y, z);
            cnt++;
        }
    }
    if (!cnt) puts("No!!!");
    return 0;
}

子集枚举

选数

[NOIP2002 普及组] 选数

题目描述

已知 n n n 个整数 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots,x_n x1,x2,,xn,以及 1 1 1 个整数 k k k k < n k<n k<n)。从 n n n 个整数中任选 k k k 个整数相加,可分别得到一系列的和。例如当 n = 4 n=4 n=4 k = 3 k=3 k=3 4 4 4 个整数分别为 3 , 7 , 12 , 19 3,7,12,19 3,7,12,19 时,可得全部的组合与它们的和为:

3 + 7 + 12 = 22 3+7+12=22 3+7+12=22

3 + 7 + 19 = 29 3+7+19=29 3+7+19=29

7 + 12 + 19 = 38 7+12+19=38 7+12+19=38

3 + 12 + 19 = 34 3+12+19=34 3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数: 3 + 7 + 19 = 29 3+7+19=29 3+7+19=29

输入格式

第一行两个空格隔开的整数 n , k n,k n,k 1 ≤ n ≤ 20 1 \le n \le 20 1n20 k < n k<n k<n)。

第二行 n n n 个整数,分别为 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots,x_n x1,x2,,xn 1 ≤ x i ≤ 5 × 1 0 6 1 \le x_i \le 5\times 10^6 1xi5×106)。

输出格式

输出一个整数,表示种类数。

样例 #1

样例输入 #1

4 3
3 7 12 19

样例输出 #1

1

提示

【题目来源】

NOIP 2002 普及组第二题

#include <iostream>
#include <cstdio>

using namespace std;

int a[30];

bool check(int x) { // 判断素数
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return false;
    }
    return true;
}

int main() {
    int n, k, ans = 0;
    cin >> n >> k;
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    int U = 1 << n; // U-1即为全集
    for (int S = 0; S < U; S++) { // 枚举所有子集[0,U)
        if (__builtin_popcount(S) == k) { // 找到k元子集
            int sum = 0;
            for (int i = 0; i < n; i++) {
                if (S & (1 << i)) sum += a[i]; // 如果第i个元素在s中
            }
            if (check(sum)) ans++;
        }
    }
    cout << ans;
    return 0;
}

组合的输出

组合的输出

题目描述

排列与组合是常用的数学方法,其中组合就是从 n n n 个元素中抽出 r r r 个元素(不分顺序且 r ≤ n r \le n rn),我们可以简单地将 n n n 个元素理解为自然数 1 , 2 , … , n 1,2,\dots,n 1,2,,n,从中任取 r r r 个数。

现要求你输出所有组合。

例如 n = 5 , r = 3 n=5,r=3 n=5,r=3,所有组合为:

123 , 124 , 125 , 134 , 135 , 145 , 234 , 235 , 245 , 345 123,124,125,134,135,145,234,235,245,345 123,124,125,134,135,145,234,235,245,345

输入格式

一行两个自然数 n , r ( 1 < n < 21 , 0 ≤ r ≤ n ) n,r(1<n<21,0 \le r \le n) n,r(1<n<21,0rn)

输出格式

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

注意哦!输出时,每个数字需要 3 3 3 个场宽。以 C++ 为例,你可以使用下列代码:

cout << setw(3) << x;

输出占 3 3 3 个场宽的数 x x x。注意你需要头文件 iomanip

样例 #1

样例输入 #1

5 3

样例输出 #1

1  2  3
  1  2  4
  1  2  5
  1  3  4
  1  3  5
  1  4  5
  2  3  4
  2  3  5
  2  4  5
  3  4  5
#include <iostream>

using namespace std;
int a[30];
int main() {
    int n, r;
    cin >> n >> r;

    for (int S = (1 << n) - 1; S >= 0; S--) { //从全集枚举到 0
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            if (S & (1 << i))
                a[cnt++] = i; //分离记录每一位
        }
        if (cnt == r) {
            for (int i = r - 1; i >= 0; i--)
                printf("%3d", n - a[i]);//按字典排序,所以要反转
            puts("");
        }
    }

    return 0;
}

排列枚举

三连击升级版

三连击(升级版)

题目描述

1 , 2 , … , 9 1, 2,\ldots, 9 1,2,,9 9 9 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A : B : C A:B:C A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!

//感谢黄小U饮品完善题意

输入格式

三个数, A , B , C A,B,C A,B,C

输出格式

若干行,每行 3 3 3 个数字。按照每行第一个数字升序排列。

样例 #1

样例输入 #1

1 2 3

样例输出 #1

192 384 576
219 438 657
273 546 819
327 654 981

提示

保证 A < B < C A<B<C A<B<C


upd 2022.8.3 \text{upd 2022.8.3} upd 2022.8.3:新增加二组 Hack 数据。

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
int a[10];
typedef long long LL;
int main(){
    LL A,B,C,x,y,z,cnt =0;
    cin>>A>>B>>C;
    for(int i=1;i<=9;i++)a[i]=i;
    do{
        x = a[1] * 100 + a[2] * 10 + a[3];
        y = a[4] * 100 + a[5] * 10 + a[6];
        z = a[7] * 100 + a[8] * 10 + a[9];
        if(x*B==y*A&&y*C==z*B)
            printf("%lld %lld %lld\n",x,y,z),cnt++;
    }while(next_permutation(a+1,a+10));
    if(!cnt)puts("No!!!");
    return 0;
}

全排列问题

全排列问题

题目描述

按照字典序输出自然数 1 1 1 n n n 所有不重复的排列,即 n n n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n n n

输出格式

1 ∼ n 1 \sim n 1n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5 5 5 个场宽。

样例 #1

样例输入 #1

3

样例输出 #1

1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

提示

1 ≤ n ≤ 9 1 \leq n \leq 9 1n9

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

int a[10],n;
int  main(){
    cin>>n;
    for(int i=1;i<=n;i++)a[i] = i;
    do{
        for(int i=1;i<=n;i++)printf("%5d",a[i]);
        puts("");
    }while(next_permutation(a+1,a+1+n));
    return 0;
}

火星人

[NOIP2004 普及组] 火星人

题目描述

人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。

火星人用一种非常简单的方式来表示数字――掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为 1 , 2 , 3 , ⋯ 1,2,3,\cdots 1,2,3,。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。

一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4 5 5 5,当它们按正常顺序排列时,形成了 5 5 5 位数 12345 12345 12345,当你交换无名指和小指的位置时,会形成 5 5 5 位数 12354 12354 12354,当你把五个手指的顺序完全颠倒时,会形成 54321 54321 54321,在所有能够形成的 120 120 120 5 5 5 位数中, 12345 12345 12345 最小,它表示 1 1 1 12354 12354 12354 第二小,它表示 2 2 2 54321 54321 54321 最大,它表示 120 120 120。下表展示了只有 3 3 3 根手指时能够形成的 6 6 6 3 3 3 位数和它们代表的数字:

三进制数代表的数字
123 123 123 1 1 1
132 132 132 2 2 2
213 213 213 3 3 3
231 231 231 4 4 4
312 312 312 5 5 5
321 321 321 6 6 6

现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。你的任务是,把火星人用手指表示的数与科学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。

输入格式

共三行。
第一行一个正整数 N N N,表示火星人手指的数目( 1 ≤ N ≤ 10000 1 \le N \le 10000 1N10000)。
第二行是一个正整数 M M M,表示要加上去的小整数( 1 ≤ M ≤ 100 1 \le M \le 100 1M100)。
下一行是 1 1 1 N N N N N N 个整数的一个排列,用空格隔开,表示火星人手指的排列顺序。

输出格式

N N N 个整数,表示改变后的火星人手指的排列顺序。每两个相邻的数中间用一个空格分开,不能有多余的空格。

样例 #1

样例输入 #1

5
3
1 2 3 4 5

样例输出 #1

1 2 4 5 3

提示

对于 30 % 30\% 30% 的数据, N ≤ 15 N \le 15 N15

对于 60 % 60\% 60% 的数据, N ≤ 50 N \le 50 N50

对于 100 % 100\% 100% 的数据, N ≤ 10000 N \le 10000 N10000

noip2004 普及组第 4 题

#include<iostream>
#include<algorithm>
using namespace std;
int a[10010],n,m;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(;m--;)next_permutation(a+1, a+1+n);
    for(int i=1;i<=n;i++)cout<<a[i]<<' ';
    return 0;
}

作业

  • 3392涂国旗
  • 3654 First Step
  • 1217 USACO Training
  • 1149 火柴棒等式
  • 3799 妖梦拼木棒
  • 2392 kkksc03 临时抱佛脚
  • 2036 Perket
  • 1433 吃奶酪

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes 准入控制

Author&#xff1a;rab 目录 前言一、限制范围二、配置案例2.1 名称空间 CPU 与内存约束2.1.1 CPU 约束2.1.2 内存约束2.1.3 默认 CPU 申请约束2.1.4 默认内存申请约束 2.2 名称空间总容量限额约束 总结 前言 LimitRange 是限制命名空间内可为每个适用的对象类别 &#xff08;…

基于51单片机的停车场管理系统仿真电路设计

**单片机设计介绍&#xff0c;基于51单片机的停车场管理系统仿真电路设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 停车场管理系统仿真电路设计介绍 停车场管理系统主要用于自动化管理和控制停车场&#xff0c;以提高停车…

Elasticsearch内存分析

文章目录 Elasticsearch JVM内存由哪些部分组成Indexing BufferNode Query CacheShard Request CacheField Data CacheSegments Cache查询 非堆内存内存压力mat分析es的jvm缓存监控 Elasticsearch JVM内存由哪些部分组成 官方建议Elasticsearch设置堆内存为32G&#xff0c;因为…

第三章:人工智能深度学习教程-人工智能与机器学习与深度学习之间的区别

人工智能基本上是通过一组规则&#xff08;算法&#xff09;将人类智能融入机器的机制。人工智能是两个词的组合&#xff1a;“人工”是指由人类或非自然物体制造的东西&#xff0c;“智能”是指相应地理解或思考的能力。另一个定义可能是“人工智能基本上是训练机器&#xff0…

Starward(米家游戏启动器)支持米哈游旗下的所有桌面端游戏

Starward应用名的由来 Starward 出自星穹铁道开服前的宣传语———愿此行&#xff0c;终抵群星 (May This Journey Lead Us Starward)&#xff0c;虽然这不是一个正确的英文单词&#xff0c;但是很适合拿来用作应用名。 Starward 是一个米家游戏启动器&#xff0c;支持米哈游旗…

web3通过antd 在React dapp中构建订单组件基本结构

上文web3 dapp React项目引入 antd 对 balance 用户token信息组件进行样式改造 中 我们导入 antd组件 算是比较完整的编写了用户资产组件 那么 今天开始 我们就要说订单组件了 这个就会比之前的复杂很多 我们还是先开环境 ganache 终端执行 ganache -d然后 将合约 发布到区块链…

Django+Celery框架自动化定时任务开发

本章介绍使用DjCelery即DjangoCelery框架开发定时任务功能&#xff0c;在Autotestplat平台上实现单一接口自动化测试脚本、业务场景接口自动化测试脚本、App自动化测试脚本、Web自动化测试脚本等任务的定时执行、调度、管理等&#xff0c;从而取代Jenkins上的定时执行脚本和发送…

趋动云云端部署ChatGLM3-6B

趋动云端部署ChatGLM3-6B 文章目录 趋动云端部署ChatGLM3-6B1.项目创建2.模型部署3.总结参考 本部分主要内容&#xff1a;1.熟悉趋动云项目创建流程2.动手部署ChatGLM3-6B模型 1.项目创建 首先是趋动云的项目的创建&#xff0c;其主要以项目为载体&#xff0c;一个项目内可以进…

深度学习连接

全连接批量归一化 目的是&#xff1a;通过归一化&#xff0c;让所有的 x i x_i xi​具有一样的分布&#xff0c;学习率是一个值&#xff0c;每个参数 w i w_i wi​梯度的值大致相当实现是&#xff1a;实际上是在全连接中增加了两个节点 γ \gamma γ, β \beta β

设置区块链节点输出等级为警告级,并把日志存储阈值位100MB并验证;

题目 获取指定区块链节点输出等级为警告级&#xff0c;并设置日志存储阈值位100MB并验证&#xff1b; 操作步骤 1.切换目录 cd nodes/127.0.0.1/node0 2.打开配置文件并修改 vim config.ini warn&#xff1a;警告

拒绝一次性芯片,新技术:无线升级芯片

其便捷性和兼容性拥有4年经验的职场人都上手试用&#xff01; 就算把产品寄到国外出问题了或需要升级 2.4G射频芯片帮您实现Mcu Ota无线升级产品0.3就能换一次救命的机会&#xff0c;相当于给产品买个保险&#xff01; 问宇凡微拿了规格书和样品&#xff0c;经过几天的摸索研…

怎么更改文件创建日期?

怎么更改文件创建日期&#xff1f;如今科技发展日新月异&#xff0c;人们对于信息和数据的依赖程度日益加深。在这个高度信息化的时代&#xff0c;文件处理已经成为数字化办公不可或缺的环节。无论是个人还是企业&#xff0c;都需要通过数字化的方式来处理和管理大量的文档、表…

聊聊低代码技术

目录 一、什么是低代码开发&#xff1f; 二、为什么需要低代码开发&#xff0c;具备哪些优势&#xff1f; 三、低代码开发在实际工作中的作用 四、是不是有了低代码&#xff0c;就能不关注“质量”呢&#xff1f; 五、引迈旗下低代码开发平台--JNPF初体验 一、什么是低代码开发…

大厂硬性要求的性能优化,如何做到极致?可从7个方向切入

关于Android开发中的性能优化也是老生常谈的技术了。在许多大厂的招聘条件中就必须要求这项技术&#xff1b;因为Android 开发越来越规范&#xff0c; 国内工程师的素质&#xff0c;以及用户对产品的要求也越来越高。所以这也间接导致我们对研发项目的质量要求到了近乎苛刻的地…

『MySQL快速上手』-③-库的操作

文章目录 1.创建数据库2.创建数据库案例3.字符集和校验规则3.2 校验规则对数据库的影响3.2.1 进行查询3.2.2 进行排序 4.字符集和检验规则的作用5.操纵数据库5.1 查看数据库5.2 显示创建语句5.3 修改数据库5.4 数据库删除 6.备份与恢复6.1 备份6.2 还原6.3 注意事项 7.查看数据…

2023年最热门的五大编程技术趋势

2023年最热门的五大编程技术趋势 摘要&#xff1a;本文将介绍2023年最热门的五大编程技术趋势&#xff0c;包括人工智能、区块链、WebAssembly、5G和边缘计算以及自动化。我们将详细讨论这些趋势的当前状态、未来展望以及如何利用这些技术来提高您的编程技能。 一、前言 随着…

【NI-DAQmx入门】数据流盘

1.NI-DAQmx高速数据流盘 1.1什么是TDMS格式 TDMS文件格式是NI推荐易于交换、固有结构化、具有高速流传输能力的文件格式&#xff0c;用于将基于时间的测量数据保存到磁盘&#xff0c;以实现高性能、可用性和复用性。借助NI-DAQmx驱动&#xff0c;可以实现将数据快速传输到磁盘…

【vue3】引入高德地图并初始化

npm安装amap/amap-jsapi-loader包 <script setup> import AMapLoader from amap/amap-jsapi-loader; /*在Vue3中使用时,需要引入Vue3中的shallowRef方法 (使用shallowRef进行非深度监听, 因为在Vue3中所使用的Proxy拦截操作会改变JSAPI原生对象 否则会出现问题,建议JSAP…

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令

前一篇文章已经对CANOE如何模拟主节点和从节点进行LIN通信做了简单的记录&#xff0c;修改主节点发送的指令需要修改LIN ISC模块里的Frames帧对应的signal。这样改起来比较麻烦且不直观&#xff0c;幸好CANOE提供了Panel designer这样的工具&#xff0c;我们可以利用它设计自己…

谷歌浏览器配置允许跨域

1、在谷歌浏览器导航栏搜索chrome://flags 2、搜索Block insecure private network requests 3、修改状态