鱼C论坛

 找回密码
 立即注册
查看: 1444|回复: 1

修改代码,感觉逻辑上没有问题

[复制链接]
发表于 2023-10-30 14:39:58 | 显示全部楼层 |阅读模式
2鱼币
#include <bits/stdc++.h>
using namespace std;
const int N=50;
vector<int>a;
int b[N];

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=0;
    for(int i=0;b[i];i++)
    {
        if(max>b[i])
        max=b[i];
    }
    cout<<max<<endl;


}
洛谷上题目链接:https://www.luogu.com.cn/problem/P2911

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-30 14:40:15 | 显示全部楼层
这段代码的逻辑上是有问题的。在循环中,我们将所有可能的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[N];

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;
}

通过这些修改,代码应该能够正确地计算并输出最大值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 17:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表