热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

竞争性编程-代码在线编译器提供不同的答案

如何解决《竞争性编程-代码在线编译器提供不同的答案》经验,为你挑选了1个好方法。

我试图在codeforces上解决问题811C.我开始编写sublime-text编码,并设法在一段时间后提出解决方案.当我运行该程序时,它给了我正确的答案但是当我提交代码时,出于某种原因我得到了代码强制的不同答案.我检查了数组是否超出范围,但这似乎不是原因.这是代码:

/* Code Readability Credit : Max Vollmer */
#include 
#include 
#include 
#include 
#include 

// terms[] stores the value of all the terms. leftMosts[i] and rightMosts[i] store the leftmost and rightmost occurrences of the ith element in terms[]. 
//solvedValues[] stands for dynamic programming and stores the pre calculated terms of the function solve()
int numberOfTerms;
int terms[5005];
int leftMosts[5005];
int rightMosts[5005];
int solvedValues[5005];

int comf(int left,int right)// comf = comfort (see problem statement if you do not understand this)
{ 
    std::set track;
    int ret = 0;
    for(int i = left; i <= right; i++)
    {
        if (!track.count(terms[i]))
        {
            ret = (ret^terms[i]);
            track.insert(terms[i]);
        }
    }
    return ret;
}

// below, solve stands for 'solve', it is terms recursive memoized function
// returns max sequence from i to (numberOfTerms-1). to find max, call solve(0, -1) so i=0,lefmost=-1. leftmost keeps track of the position of last index of last chosen set.
int solve(int i, int leftmost)
{
    if (i >= numberOfTerms)
    {
        return 0;
    }

    if (solvedValues[i] != -1)
    {
        return solvedValues[i];
    }

    if (leftMosts[i] <= leftmost)
    {
        return solve(i+1, leftmost);// we cant go choose leftMosts[i] to rightMosts[i] so we move on
    }

    // decide if it is better to choose current leftMosts[i] to rightMosts[i] or better to simply move on and skip this.
    return solvedValues[i] = std::max(comf(leftMosts[i], rightMosts[i]) + solve(rightMosts[i]+1, rightMosts[i]), solve(i+1, leftmost));
}

void init()
{
    scanf("%d", &numberOfTerms);
    for(int i = 0; i  i; rightIndex--)
        {
            if (terms[rightIndex] == terms[i])
            {
                rightMosts[i] = rightIndex;
                break;
            }
        }

        if (leftMosts[i] == -1)
        {
            leftMosts[i] = i;// if there is no leftmost occ, then leftmost is current
        }

        if (rightMosts[i] == -1)
        {
            rightMosts[i] = i;// same as above for rightmost
        }
    }

    printf("%d\n", solve(0, -1));

    return 0;
}

这是测试用例:

100 931 4584 2116 3004 3813 62 2819 2998 2080 4906 3198 2443 2952 3793 1958 3864 3985 3169 3134 4011 4525 995 4163 308 4362 1148 4906 3092 1647 244 1370 1424 2753 84 2997 1197 2606 425 3501 2606 683 4747 3884 4787 2166 3017 3080 4303 3352 1667 2636 3994 757 2388 870 1788 988 1303 0 1230 1455 4213 2113 2908 871 1997 3878 4604 1575 3385 236 847 2524 3937 1803 2678 4619 1125 3108 1456 3017 1532 3845 3293 2355 2230 4282 2586 2892 4506 3132 4570 1872 2339 2166 3467 3080 2693 1925 2308

正确的输出应该是:

227685

Codeforces的错误输出:

245849

再次,在我的机器上,代码工作正常并输出227685但是当它在线运行时,代码输出245849由于某种原因.代码可以在这里在线测试. 这是在本地计算机上运行的代码的图像.

我很想知道造成这种情况的原因.

更新: 此错误是由于最终计算值设置为时未考虑leftmost函数中的变量引起的.这是对问题的错误/不正确的方法,并导致诸如影响代码输出的顺序之类的问题.solve(int i,int leftmost)solvedValues[i]std::max()



1> Max Vollmer..:

结果不同的原因

您使用的参数std::max在线和本地计算机上以不同的顺序执行.当comf(leftMosts[i], rightMosts[i]) + solve(rightMosts[i]+1, rightMosts[i])被执行之前solve(i+1, leftmost),你得到想要的结果.如果交换订单,则会得到错误的结果.

有效的重构代码

这是我重构的代码,以提高可读性.我所做的一件事就是打破长期的回报slv.如果切换线的顺序int a =...int b =...你会得到错误的结果:

#include 
#include 
#include 
#include 
#include 

// terms[] stores the value of all the terms. leftMosts[i] and rightMosts[i] store the leftmost and rightmost occurrences of the ith element in terms[]. 
//solvedValues[] stands for dynamic programming and stores the pre calculated terms of the function solve()
int numberOfTerms;
int terms[5005];
int leftMosts[5005];
int rightMosts[5005];
int solvedValues[5005];

int comf(int left,int right)
{ 
    std::set track;
    int ret = 0;
    for(int i = left; i <= right; i++)
    {
        if (!track.count(terms[i]))
        {
            ret = (ret^terms[i]);
            track.insert(terms[i]);
        }
    }
    return ret;
}

// below, solve stands for 'solve', it is terms recursive memoized function
// returns max sequence from i to (numberOfTerms-1). to find max, call solve(0, -1) so i=0,lefmost=-1. leftmost keeps track of the position of last index of last chosen set.
int solve(int i, int leftmost)
{
    if (i >= numberOfTerms)
    {
        return 0;
    }

    if (solvedValues[i] != -1)
    {
        return solvedValues[i];
    }

    if (leftMosts[i] <= leftmost)
    {
        return solve(i+1, leftmost);// we cant go choose leftMosts[i] to rightMosts[i] so we move on
    }

    // decide if it is better to choose current leftMosts[i] to rightMosts[i] or better to simply move on and skip this.
    int a = comf(leftMosts[i], rightMosts[i]) + solve(rightMosts[i]+1, rightMosts[i]);
    int b = solve(i+1, leftmost);
    return solvedValues[i] = std::max(a, b);
}

void init()
{
    scanf("%d", &numberOfTerms);
    for(int i = 0; i  i; rightIndex--)
        {
            if (terms[rightIndex] == terms[i])
            {
                rightMosts[i] = rightIndex;
                break;
            }
        }

        if (leftMosts[i] == -1)
        {
            leftMosts[i] = i;// if there is no leftmost occ, then leftmost is current
        }

        if (rightMosts[i] == -1)
        {
            rightMosts[i] = i;// same as above for rightmost
        }
    }

    printf("%d numberOfTerms", solve(0, -1));

    return 0;
}

我们从中学到了什么?

可读,干净的代码不仅对你的程序员(和你自己)很好,它还可以降低bug的风险.


推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
huanhuan199538
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有