• 个人简介

    网站

    在线md

    打字网站

    枚举

    将所有的可能一个一个列举出来尝试每一种可能---暴力枚举

    使用枚举的情况

    1. 最优解
    2. 方案数目
    3. 可行的方案

    枚举的流程

    能不能枚举 → 枚举谁 → 怎么枚举 → 早点停

    1. 能不能枚举(10^8)
    2. 枚举的范围: 最大、最小
    3. 用 for 例举出所有的坑(一层、两层...)
    4. 判断 + 提前停

    image-20260128122648408

    for i=n to  m
    	if i%3==0 and i%5!=0
            cout i
    

    多重枚举

    枚举的对象不止一个

    for i=1 to n-1
        for j=i+1 to n
            if	i+j == k
                cout yes
                return 0;
    cout no
        
    
    • 能不能枚举(<10^8) 10^6
    • 枚举的范围: 最大、最小 :arr[0] to arr[n]
    • 用 for 例举出所有的坑(一层、两层...):for i + for j
    • 判断 + 提前停:可以

    水仙花数

    #include <iostream>
    using namespace std;
    int main(){
        for(int i=100;i<=999;i++){
            int g=i%10;
            int s=i/10%10;
            int b=i/100;
            if(g*g*g+s*s*s+b*b*b==i){
                cout<<i<<" ";
            }        
        }
        return 0;
    }
    
    

    百元百鸡

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main(){
    	//100 块买  100 只鸡  g 5 
    	for(int g=1;g<20;g++){
    		for(int m=1;m<33;m++){
    			int x = 100-(g+m);
    			if(100==g*5+m*3+x/3 && x%3==0){
    				cout << g << ' ' << m << ' ' <<x<<endl;
    			}
    		}
    	} 
    	   
    	return 0;
    }
    

    数字翻转

    #include <bits/stdc++.h>
    #define DEBUG(var) cout << "[DEBUG]" << #var << " = " << var << endl
    using namespace std;
    
    int main() {
      int n1, n2;
      scanf("%d %d", &n1, &n2);
    
      int t1 = 0, t2 = 0;
      while (n1 != 0) {
        t1 = t1 * 10 + n1 % 10;
        n1 /= 10;
      }
      while (n2 != 0) {
        t2 = t2 * 10 + n2 % 10;
        n2 /= 10;
      }
      cout << (t1 > t2 ? t1 : t2) << endl;
      return 0;
    }
    
    • 能不能枚举 不需要枚举多个情况, 每个数字 逐位处理一次,数据规模很小,一定能做

    • 处理的范围 枚举的是数字的 每一位 范围:从 个位到最高位

    • 用循环处理所有“坑”while (n != 0) 每次取一位数字,直到所有位都处理完

    • 判断 + 提前结束 当数字变成 0 时,说明所有位都处理完,循环结束 最后比较反转后的两个数,输出较大的那个

    万元万鸡

    #include <bits/stdc++.h>
    #define DEBUG(var) cout << "[DEBUG]" << #var << " = " << var << endl
    using namespace std;
    
    int main() {
      for (long long i = 4; i * 5 < 10000; i++) {
        for (long long j = 1; j * 3 < 10000; j++) {
          long long k = 10000 - i - j;  // 计算k的值
          if (i + j + k == 10000 && i * 5 + j * 3 + k / 3 == 10000 && k % 3 == 0) {
            printf("%lld %lld %lld\n", i, j, k);
          }
        }
      }
    
      return 0;
    }
    

    和数

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
    
        int a[105];   // n <= 100,数组开大一点更安全
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        
        int ans = 0;
        
        // 枚举目标数 a[k]
        for (int k = 0; k < n; k++) {
            bool ok = false;
    
            // 枚举两个加数
            for (int i = 0; i < n && !ok; i++) {
                for (int j = 0; j < n; j++) {
                    // 三个下标不能相同
                    if (i != j && i != k && j != k) {
                        if (a[i] + a[j] == a[k]) {
                            ok = true;
                            break;
                        }
                    }
                }
            }
    
            if (ok) ans++;
        }
    
        cout << ans << endl;
        return 0;
    }
    
    
    

    进阶

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
    
        int a[105];
        bool exist[10001] = {false};
        bool used[10001] = {false};  // 防止重复统计同一个“和”
    
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            exist[a[i]] = true;
        }
    
        int ans = 0;
    
        // 枚举两个加数
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                int sum = a[i] + a[j];
    
                // 判断 sum 是否是数组中的“第三个数”
                if (sum <= 10000 && exist[sum] && !used[sum]) {
                    used[sum] = true;
                    ans++;
                }
            }
        }
    
        cout << ans << endl;
        return 0;
    }
    
    
  • 最近活动