cheng827922 2024-07-20 14:15 采纳率: 0%
浏览 2

c++在做头文件时产生导入问题?

五年级升六年级 刚学完分数 封装了一个头文件

#include<bits/stdc++.h>
#define um unordered_map
#define ll long long 
using namespace std;
const int N = 30;
int n , m , a[N] , mid , cnt1 , cnt2;
ll S , res , jc[N]; 
pair<int , ll> c[1594324] , d[1594324];
um<ll , int> st;
void dfs(int k , int j , ll v) {
    if(k == mid + 1) {
        c[++ cnt1] = {j , v};
        return;
    }
    dfs(k + 1 , j , v);
    if(v + a[k] <= S) dfs(k + 1 , j , v + a[k]);
    if(j + 1 <= m && a[k] <= 18 && v + jc[a[k]] <= S) dfs(k + 1 , j + 1 , v + jc[a[k]]);
}
void redfs(int k , int j , ll v) {
    if(k == n + 1) {
        d[++ cnt2] = {j , v};
        return;
    }
    redfs(k + 1 , j , v);
    if(v + a[k] <= S) redfs(k + 1 , j , v + a[k]);
    if(j + 1 <= m && a[k] <= 18 && v + jc[a[k]] <= S) redfs(k + 1 , j + 1 , v + jc[a[k]]);
}

int main(void) {
    
    cin >> n >> m >> S;
    
    jc[0] = 1;
    
    for(int i = 1 ; i <= 18 ; ++ i) {
        jc[i] = jc[i - 1] * i;
    }
    
    for(int i = 1 ; i <= n ; ++ i) {
        cin >> a[i];
    }
    
    mid = n / 2;
    
    dfs(1 , 0 , 0) , redfs(mid + 1 , 0 , 0);
    
    sort(c + 1 , c + 1 + cnt1); sort(d + 1 , d + 1 + cnt2);
    
    int j = cnt2;
    
    for(int i = 1 ; i <= cnt2 ; ++ i) {
        st[d[i].second] ++ ;
    }
    
    for(int i = 1 ; i <= cnt1 ; ++ i) {
        while(j && c[i].first + d[j].first > m) {
            st[d[j].second] -- ;
            j -- ;
        }
        res += st[S - c[i].second];
    }
    
    cout << res << endl;
    
    return 0; 

} 

** 在编译的时候没有问题 但导入时有问题 **

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-20 14:15
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    你的代码中存在一些问题,可能会导致编译或运行时错误。以下是一些可能的解决方案:

    1. 使用<bits/stdc++.h>的问题

      • <bits/stdc++.h>是一个非标准的头文件,它在不同的编译器中可能不兼容。建议使用标准的头文件,例如:
        #include <iostream>
        #include <vector>
        #include <map>
        #include <algorithm>
        
    2. 命名空间的使用

      • 使用using namespace std;可能会导致命名冲突。建议避免使用它,或者在需要的地方使用std::前缀。
    3. 宏定义的使用

      • 定义umll作为宏可能会与标准库中的类型或宏冲突。建议使用更明确的命名,例如:
        typedef unordered_map<ll, int> um;
        typedef long long ll;
        
    4. 数组和变量的初始化

      • 确保数组和变量在使用前已经正确初始化。例如:
        ll jc[19] = {0}; // 初始化为0
        
    5. 递归函数的逻辑

      • 确保dfsredfs函数的逻辑是正确的,并且它们能够正确地处理所有边界情况。例如:
        void dfs(int k, int j, ll v) {
            if (k == mid + 1) {
                c[++cnt1] = {j, v};
                return;
            }
            dfs(k + 1, j, v);
            if (v + a[k] <= S) dfs(k + 1, j, v + a[k]);
            if (j + 1 <= m && a[k] <= 18 && v + jc[a[k]] <= S) dfs(k + 1, j + 1, v + jc[a[k]]);
        }
        
    6. 排序和搜索算法的使用

      • 确保sort函数的使用是正确的,并且st映射的使用符合预期。例如:
        sort(c + 1, c + cnt1 + 1); // 修正索引
        sort(d + 1, d + cnt2 + 1); // 修正索引
        
    7. 输入输出的处理

      • 确保输入数据的读取和输出结果的打印是正确的,并且格式符合题目要求。例如:
        cin >> n >> m >> S;
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
        }
        
    8. 编译器警告和错误

      • 仔细检查编译器的输出,以识别任何警告或错误,并根据提示进行相应的代码修改。

    以下是修改后的代码示例:

    #include <iostream>
    #include <vector>
    #include <map>
    #include <algorithm>
    #include <cmath>
    
    typedef long long ll;
    typedef std::unordered_map<ll, int> um;
    
    const int N = 30;
    int n, m, a[N], mid, cnt1, cnt2;
    ll S, res, jc[19];
    std::pair<int, ll> c[1594324], d[1594324];
    um<ll, int> st;
    
    void dfs(int k, int j, ll v) {
        if (k == mid + 1) {
            c[++cnt1] = {j, v};
            return;
        }
        dfs(k + 1, j, v);
        if (v + a[k] <= S) dfs(k + 1, j, v + a[k]);
        if (j + 1 <= m && a[k] <= 18 && v + jc[a[k]] <= S) dfs(k + 1, j + 1, v + jc[a[k]]);
    }
    
    void redfs(int k, int j, ll v) {
        if (k == n + 1) {
            d[++cnt2] = {j, v};
            return;
        }
        redfs(k + 1, j, v);
        if (v + a[k] <= S) redfs(k + 1, j, v + a[k]);
        if (j + 1 <= m && a[k] <= 18 && v + jc[a[k]] <= S) redfs(k + 1, j + 1, v + jc[a[k]]);
    }
    
    int main(void) {
        std::cin >> n >> m >> S;
    
        jc[0] = 1;
        for (int i = 1; i <= 18; ++i) {
            jc[i] = jc[i - 1] * i;
        }
    
        for (int i = 1; i <= n; ++i) {
            std::cin >> a[i];
        }
    
        mid = n / 2;
    
        dfs(1, 0, 0), redfs(mid + 1, 0, 0);
    
        sort(c + 1, c + cnt1 + 1); // 修正索引
        sort(d + 1, d + cnt2 + 1); // 修正索引
    
        int j = cnt2;
    
        for (int i = 1; i <= cnt2; ++i) {
            st[d[i].second]++;
        }
    
        for (int i = 1; i <= cnt1; ++i) {
            while (j && c[i].first + d[j].first > m) {
                st[d[j].second]--;
                j--;
            }
            res += st[S - c[i].second];
        }
    
        std::cout << res << std::endl;
    
        return 0;
    }
    

    希望这些修改能帮助你解决编译和运行时的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月20日

悬赏问题

  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。