修改代码,感觉逻辑上没有问题
#include <bits/stdc++.h>using namespace std;
const int N=50;
vector<int>a;
int b;
int main()
{
int s1,s2,s3;
cin>>s1>>s2>>s3;
memset(b,0,sizeof(b));
for(int i=1;i<=s1;i++)
{
for( int j=1;j<=s2;j++)
{
for(int k=1;k<=s3;k++)
{
a.push_back(i+j+k);
}
}
}
sort(a.begin(),a.end());
for(auto i:a)
{
b++;
}
int max=0;
for(int i=0;b;i++)
{
if(max>b)
max=b;
}
cout<<max<<endl;
}
洛谷上题目链接:https://www.luogu.com.cn/problem/P2911 这段代码的逻辑上是有问题的。在循环中,我们将所有可能的i+j+k的结果都存储在向量a中,然后对a进行排序。接下来,我们遍历向量a,并将每个元素的计数存储在数组b中。最后,我们在数组b中查找最大值并输出。
然而,这段代码有两个问题:
1. 我们没有初始化变量max的值。在for循环之前,我们应该将max初始化为一个较小的值,例如INT_MIN。
2. 在第二个for循环中,我们应该使用小于等于号(<=)而不是小于号(<)来判断循环的终止条件。因为数组b的元素可能为0,所以当b[ i]为0时,循环应该终止。
下面是修改后的代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 50;
vector<int> a;
int b;
int main()
{
int s1, s2, s3;
cin >> s1 >> s2 >> s3;
memset(b, 0, sizeof(b));
for (int i = 1; i <= s1; i++)
{
for (int j = 1; j <= s2; j++)
{
for (int k = 1; k <= s3; k++)
{
a.push_back(i + j + k);
}
}
}
sort(a.begin(), a.end());
for (auto i : a)
{
b[ i]++;
}
int max = INT_MIN;
for (int i = 0; b[ i] <= 0; i++)
{
if (max < b[ i])
max = b[ i];
}
cout << max << endl;
}
通过这些修改,代码应该能够正确地计算并输出最大值了。
页:
[1]