枚举和模拟算法笔记

枚举:

不断猜测,从可能的答案集合中一一尝试,然后再判断题目的条件是否成立。枚举每一种可能性

1.找对答案集合 1~~100最大的质数

2.答案成立的条件--->题目给出

3.选择合适的枚举顺序

4.减小枚举范围---->提高效率

大多数用for循环就行,但有些不行

搜索 dfs bfs ----暴力搜索

eg.全排列 1~3 123 132 213 231 312 321中哪个符合....条件

模拟

直接按照要求操作,思路简单,但操作和代码量大

有的题目不会直接告诉你操作步骤,需要自己去分析

模拟和枚举统称暴力

做题步骤

1.读题面,看样例

2.看数据范围,确定时间复杂度和数据类型

例题1:https://www.luogu.com.cn/problem/P1003

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n;
    cin>>n;
    //定义一个二维数组 n行4列
    vector<vector<int>> vec(n,vector <int>(4,0));
    int a,b,g,k;
    for(int i=0;i<n;i++){
            scanf("%d %d %d %d",&a,&b,&g,&k);
            vec[i][0]=a;vec[i][1]=b;vec[i][2]=g;vec[i][3]=k;
        }
    int x,y;
    scanf("%d %d",&x,&y);
    for(int i=n-1;i>=0;i--){
        if(x<=vec[i][0]+vec[i][2]&&x>=vec[i][0]&&y>=vec[i][1]&&y<=vec[i][1]+vec[i][3]){
             printf("%d",i+1);
           return 0;
        }
    }
    printf("%d",-1);
}

例题2:59. 螺旋矩阵 II - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    
     vector<vector<int>> generateMatrix(int n) {
     vector<vector<int>> arr(n, vector<int>(n, 0));
     int i = 1;
     int a = 0, b = n - 1, c = 0, d = n - 1;
     while (i <= n * n)
     {
         for (int x = a; x <= b; x++)
         {
             arr[c][x] = i;
             i++;
         }
        
         c++;
         for (int x = c; x <= d; x++)
         {
             arr[x][b] = i;
             i++;
         }
         b--;
         for (int x = b; x >= a; x--)
         {
             arr[d][x] = i;
             i++;
         }
         d--;
         for (int x = d; x >= c; x--)
         {
             arr[x][a] = i;
             i++;
         }
         a++;
     }
     return arr;
 }
};

例3.https://www.luogu.com.cn/problem/P1328#ide

cpp 复制代码
#include<iostream>
using namespace std;
int main()
{
    int N,NA,NB;
    int sum1=0;
    int sum2=0;
    cin>>N>>NA>>NB;
    //二维数组存储表格,下标正好表示出的手势
    int arr[5][5]{0,0,1,1,0,
                  1,0,0,1,0,
                  0,1,0,0,1,
                  0,0,1,0,1,
                  1,1,0,0,0};//这是甲对乙的结果,那么乙对甲呢?下标调换一下就行了
    //周期性                 //其实应该理解为前对后的结果
    int A[200],B[200];
    for(int i=0;i<NA;i++){
        cin>>A[i];
    }
    for(int i=0;i<NB;i++){
        cin>>B[i];
    }
    int temp1=0,temp2=0;
    for(int i=0;i<N;i++){
      temp1=temp2=i;
      temp1%=NA;  //周期的下标
      temp2%=NB;
    
    sum1+=arr[A[temp1]][B[temp2]]; //赢了就得分,否则不得分
    sum2+=arr[B[temp2]][A[temp1]];
    }
    printf("%d %d",sum1,sum2);
}
相关推荐
xqqxqxxq26 分钟前
AI Agent学习:Agent协作工具技术笔记(李博杰《深入理解 AI Agent》4.6观后总结)
笔记·学习
handler0130 分钟前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存
郝学胜-神的一滴1 小时前
C++11 工程级应用 09:告别无谓拷贝,解锁高性能移动语义
开发语言·数据结构·c++·vscode·软件工程·visual studio
2601_965742221 小时前
全媒体运营与短视频代运营,两者有什么区别?
大数据·数据结构·人工智能·算法·ai·媒体
wordbaby2 小时前
混合检索:两全其美的艺术
人工智能·算法
彧azz2 小时前
数据结构:关于图的学习
c语言·数据结构·笔记·学习·算法
热心网友俣先生2 小时前
A题-药材的烘干问题-题意逐句翻译
算法·数学建模
自小吃多2 小时前
高云 FPGA 添加时序约束笔记
笔记·fpga开发
2601_960356382 小时前
2026秋招运营分析师能力模型:SQL、指标体系、AIGC与业务分析
算法
hetao17338372 小时前
校内场-提高组 ZYZSC-S-Round 4
c++·算法