Maxmilite @ 2020-10-17 08:08:16
(万里红中一点绿)
#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;
}
就这么个破点我调了六分钟....
朋友们 千万不能乱用指针
by impuk @ 2020-10-17 08:11:15
指针挺好用的,挂了说明你写的代码风格不好
by Maxmilite @ 2020-10-17 08:12:43
新情况
吸氧错两点
不吸氧AC
吸氧结果
不吸氧
by zzqDeco @ 2020-10-17 08:14:11
自己代码风格问题吧
by Cutest_Junior @ 2020-10-17 08:26:53
UB 实锤
by Maxmilite @ 2020-10-17 08:37:51
@一只爬行者 @zzqDeco
阿好的谢谢大佬
另外大佬能帮我看下写码风格哪里出问题了吗
by WanderingTrader @ 2020-10-17 08:49:33
@Maxmilite 调了六分钟你叫个啥?你是不知道一个小bug动辄several hrs的感受吧
by duyi @ 2020-10-17 08:49:48
不要再函数里这样开数组,一定要定义在函数里,使用 vector
或 static
你的代码换成 static int nowp[maxg]
就过了。https://www.luogu.com.cn/record/39933007
by WanderingTrader @ 2020-10-17 08:49:49
自己注意一下就好了
by int64 @ 2020-10-17 08:51:00
打死你个异教徒!!!
by JacderZhang @ 2020-10-17 09:02:11
这跟指针一点关系都没有,是非法内存访问。前后两份代码结果不一样不是因为用没用指针,而是因为nowp
数组在内存的位置不同。在没有捕获的情况下访问不属于该函数的栈空间是未定义行为,所以这里厌氧。应该用static
放到堆空间里(不推荐)或者把nowp
malloc出来