朋友们 千万不能乱用指针
查看原帖
朋友们 千万不能乱用指针
274993
Maxmilite楼主2020/10/17 08:08

while(1) n++ 次不应该出现的错误

(万里红中一点绿)

起因

#include <bits/stdc++.h>
using namespace std;
#define regint register int
#define opt tie(0)
#define maxv 30
#define maxg 20
int v, g, ans(114514);
int stdd[maxv], nowd[maxg][maxv];
int vis[maxg], cpy[maxg];
void dfs(int x, int cnt, ------>int mk[]<-------)
{
    if (x > g)
        return;
    cnt++;
    vis[x] = 1;
    for(int i = 1;i <= v;++i)
        mk[i] += nowd[x][i];
    int mark = 1;
    for(int i = 1;i <= v;++i)
        if(mk[i] < stdd[i])
        {
            mark = 0;
            for(int i = 1;i <= g - x;++i)
                dfs(x + i,cnt,mk);
            break;
        }
    if(cnt < ans && mark)
    {
        for(int i = 1;i <= g;++i)
            cpy[i] = vis[i];
            ans = cnt;
    }
    for(int i = 1;i <= v;++i)
        mk[i] -= nowd[x][i];
    vis[x] = 0;
    return;

}
int main()
{
    ios::sync_with_stdio(false);
    cin.opt;
    cout.opt;
    cin >> v;
    for (int i(1); i <= v; ++i)
        cin >> stdd[i];
    cin >> g;
    for (int i(1); i <= g; ++i)
        for (int j(1); j <= v; ++j)
            cin >> nowd[i][j];
    ------>int nowp[maxg] = {0}<-------;
    for(int i = 1;i <= g;++i)
        dfs(i, 0, ------>nowp<-------);
    cout << ans << ' ';
    for (int i(1); i <= g; ++i)
        if (cpy[i])
            cout << i << ' ';
    cout << endl;
    return 0;
}

做题时想到了用一个数组来记录当前使用饲料后奶牛的维生素含量,于是想到了直接在dfs中引用一个数组指针

于是在某种不明确的情况下(貌似发生了内存泄露

出现了开头图所示的情况

错误点主要在第二个测试点

Wrong Answer. wrong answer On line 1 column 4, read 1, expected 2.

(当时的我:????? (本地测试第二个测试点与标准答案一致)

(然而洛谷评测机第一种饲料读到了1)

解决方案

把记录含量的数组直接开成全局的就行了

#include <bits/stdc++.h>
using namespace std;
#define regint register int
#define opt tie(0)
#define maxv 30
#define maxg 20
int v, g, ans(114514);
int stdd[maxv], nowd[maxg][maxv];
int vis[maxg], cpy[maxg], mk[maxg];
void dfs(int x, int cnt)
{
    if (x > g)
        return;
    cnt++;
    vis[x] = 1;
    for (int i = 1; i <= v; ++i)
        mk[i] += nowd[x][i];
    int mark = 1;
    for (int i = 1; i <= v; ++i)
        if (mk[i] < stdd[i])
        {
            mark = 0;
            for (int i = 1; i <= g - x; ++i)
                dfs(x + i, cnt);
            break;
        }
    if (cnt < ans && mark)
    {
        for (int i = 1; i <= g; ++i)
            cpy[i] = vis[i];
        ans = cnt;
    }
    for (int i = 1; i <= v; ++i)
        mk[i] -= nowd[x][i];
    vis[x] = 0;
    return;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.opt;
    cout.opt;
    cin >> v;
    for (int i(1); i <= v; ++i)
        cin >> stdd[i];
    cin >> g;
    for (int i(1); i <= g; ++i)
        for (int j(1); j <= v; ++j)
            cin >> nowd[i][j];
    for (int i = 1; i <= g; ++i)
        dfs(i, 0);
    cout << ans << ' ';
    for (int i(1); i <= g; ++i)
        if (cpy[i])
            cout << i << ' ';
    cout << endl;
    return 0;
}

就这么个破点我调了六分钟....

朋友们 千万不能乱用指针

2020/10/17 08:08
加载中...