HDU 1911 Showstopper 二分搜素

news2025/1/23 1:00:04

一、题目翻译

如果没有发现细微的形式,那么对大量数据集合进行数据挖掘是一件痛苦而又长时间的过程。

一家公司的某个软件成对的使用组件生成了大量的数据对象,因为是成对使用,所以每个数据对象出现的次数一定为偶数次,但是在多次巧合的影响下,某些情况出现了问题,确定有且仅有一个数据对象出现了奇数次,请您编写一个程序,找出这个出现了奇数次的元素。

题目包含多组测试用例,用一行或者多行空行来分割,每个数列的表现形式为 x y z,数列的元素为 x,x+2*z,x+3*z...x+k*z,满足(x+k*z)<=y

输出,如果没有数据对象出现了奇数次,输出no corruption,如果有,输出这个数字,和这个数字出现的次数(题目确保最多只有一个数据对象出现了奇数次)

二、解题思路

假设所有的数列都不包含某个数字出现了奇数次,那么 给定任意一个R,所有数列的小于等于R的元素出现的次数求和一定是一个偶数。

如果其中有且仅有一个元素P出现了奇数次,其他的元素都出现了偶数次,那么当R小于P时,所有数列的小于等于R的元素出现的次数求和也一定是一个偶数;但是当R大于等于P时,所有数列的小于等于R的元素出现的次数求和也一定是一个奇数。

因为多个数字求和,其中如果都是偶数,那么结果也一定时偶数!但是如果一堆偶数中出现一个奇数,那么最终的和也一定为奇数!

所以本题目就可以去二分这个R,一定有当R大于等于P时,不管R为多大,所有数列小于等于R的元素出现次数和一定为奇数。当R小于P时,不管R为多小,所有数列小于等于R的元素出现次数和一定为偶数。

同时网上的题解说这个题目可以用fgets来获取输入,但是我当时不知道,使用的是最基础的scanf("%c,&c),一个字符一个字符的读入!

运行情况如下:

三、代码

 一点点小建议!做算法题,除非迫不得已想不出来!否则不推荐去看别人的代码,能不能看懂是一方面,更重要的是比源码更重要的是能写出源码的逻辑和思维!

#include <iostream>
using namespace std;
typedef long long ll;
struct Node
{
    ll x, y, z;
    Node(ll x = 0, ll y = 0, ll z = 0) : x(x), y(y), z(z) {}
};
char charArray[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
Node nodes[1000007];
int N;
ll max(ll a, ll b)
{
    if (a > b)
    {
        return a;
    }
    else
    {
        return b;
    }
}
ll min(ll a, ll b)
{
    if (a < b)
    {
        return a;
    }
    else
    {
        return b;
    }
}
bool isNumber(char c)
{

    for (int i = 0; i < 10; i++)
    {
        if (c == charArray[i])
        {
            return true;
        }
    }
    return false;
}
bool isBlank(char c)
{
    return c == ' ';
}
bool judge(ll mid)
{
    int count = 0;
    for (int i = 1; i <= N; i++)
    {
        // 要求mid小于x,并且x<=y
        if (mid < nodes[i].x || nodes[i].y < nodes[i].x)
        {
            continue;
        }
        int len = 0;
        if (mid < nodes[i].y)
        {
            len = mid - nodes[i].x;
        }
        else
        {
            len = nodes[i].y - nodes[i].x;
        }
        len = len / nodes[i].z;
        len++;
        count += (len % 2);
    }
    return count % 2 == 0;
}
ll calcCount(ll num)
{
    ll count = 0;
    for (int i = 1; i <= N; i++)
    {
        if (num < nodes[i].x || nodes[i].y < nodes[i].x || num > nodes[i].y)
        {
            continue;
        }
        if ((num - nodes[i].x) % nodes[i].z == 0)
        {
            count++;
        }
    }
    return count;
}
void binarySearch(ll mint, ll maxt)
{
    ll left = mint - 1;
    ll right = maxt + 1;
    while (left + 1 < right)
    {
        ll mid = (left + right) / 2;
        if (judge(mid))
        {
            left = mid;
        }
        else
        {
            right = mid;
        }
    }
    if (left == maxt)
    {
        printf("no corruption\n");
    }
    else
    {
        printf("%lld %lld\n", right, calcCount(right));
    }
}
void flush()
{
    for (int i = 1; i <= N + 1; i++)
    {
        nodes[i].x = 0;
        nodes[i].y = 0;
        nodes[i].z = 0;
    }
}
void solve()
{
    // test
    int mint = nodes[1].x, maxt = nodes[1].y;
    for (int i = 1; i <= N; i++)
    {
        mint = min(nodes[i].x, mint);
        maxt = max(nodes[i].y, maxt);
    }
    binarySearch(mint, maxt);
}
int main()
{
    char c;
    N = 1;
    bool isOK = false;
    int mode = 1;
    int nextLineCount = 0;
    while (~scanf("%c", &c))
    {
        if (isNumber(c))
        {
            nextLineCount = 0;
            switch (mode)
            {
            case 1:
                nodes[N].x = nodes[N].x * 10 + (c - '0');
                break;
            case 2:
                nodes[N].y = nodes[N].y * 10 + (c - '0');
                break;
            case 3:
                nodes[N].z = nodes[N].z * 10 + (c - '0');
                break;
            default:
                break;
            }
        }
        else if (isBlank(c))
        {
            mode++;
        }
        else if (c == '\n')
        {
            if (nextLineCount == 0)
            {
                N++;
                mode = 1;
            }
            nextLineCount++;
        }
        if (nextLineCount > 1 && N > 1)
        {
            N--;
            solve();
            flush();
            N = 1;
        }
    }
    if (nodes[1].x != 0)
    {
        if (nodes[N].x == 0)
        {
            N--;
        }
        solve();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/942798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学生成绩管理系统【控制台+MySQL】(Java课设)

系统类型 控制台类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87738977 更多系统资源库地…

验收测试怎么做?需要怎么配合

验收测试的流程&#xff0c;是验证系统是否达到了用户需求规格说明书&#xff08;可能包括项目或产品验收准则&#xff09;中的要求&#xff0c;测试试图尽可能地发现软件中存留的缺陷&#xff0c;从而为软件进一步改善提供帮助&#xff0c;并保证系统或软件产品Z终被用户接受。…

如何用 QGIS 下载高清天地图影像机,同时解决下载质量差的问题!

使用 QGIS 我们可以获得下面这种图像,既有大范围,又有更高的细节(地图级别),基本上把整个苏州市中心城区的建筑物都囊括进去了。 还可以下载大范围、高清晰度的各种在线卫星底图服务的影像,比如大面积的哨兵2影像,但国外的服务器一般都很烂,不可能是电信、移动的问题,…

Python环境下载安装使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

03.OA项目之我的会议(查询会议排座送审)

目录 会议查询 会议排座 会议送审 思路&#xff1a; 关键性会议SQL的编写后台实现前台实现 会议查询 MeetingInfoDao.java // 通用的会议查询SQL语句&#xff0c;包含会议信息表数据&#xff0c;主持人姓名、审批人姓名、会议状态private String getSQL() {return "…

四、MySQL(表操作)如何添加字段?修改表?删除字段?修改表名?删除表?格式化某张表?

1、添加字段 &#xff08;1&#xff09;基础语法&#xff1a; alter table 表名 add 字段名 类型名(长度) [comment注释] [约束]; &#xff08;2&#xff09;示例&#xff1a;添加nickname这个字段 2、修改表 修改表中某个字段的【数据类型】/【数据类型&字段名】 &…

【视频录制】MAC下录频软件对比

目录 各软件对比 OBS FiImage Omi录频专家 好录 各软件对比 名称下载地址优点缺点OBSOpen Broadcaster Software | OBS 1. 免费使用 2. 视频高清 3. 可做直播 1. 没有暂停继续 2. 开启没有缓冲时间&#xff0c;需要手动剪辑片头片尾 3. 配置音频麻烦 4. 有时会CPU很高卡死…

图像扭曲之锯齿

源码&#xff1a; void wave_sawtooth(cv::Mat& src,cv::Mat& dst,double amplitude,double wavelength) {dst.create(src.rows, src.cols, CV_8UC3);dst.setTo(0);double xAmplitude amplitude;double yAmplitude amplitude;int xWavelength wavelength;int yWave…

AES+base64+远程加载----ConsoleApplication811项目

ConsoleApplication9.cpp // ConsoleApplication9.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include <Windows.h> #include <wininet.h> #include "base64.h" #include "AES.h" …

浅析三维模型OBJ格式轻量化压缩集群处理方法

浅析三维模型OBJ格式轻量化压缩集群处理方法 三维模型的OBJ格式轻量化压缩是指通过一系列技术和方法将三维模型的文件大小进一步减小&#xff0c;以提高模型在计算机中的加载、传输和存储效率。集群处理技术是指利用多台计算机构成的集群来并行处理任务&#xff0c;以加速计算过…

FPGA GTX全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX 接收接口GTX IP核调用和使用 4、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条视频数据组包GTX aurora 8b/10b数据…

激活函数总结(二十三):激活函数补充(Piecewise Linear Unit、CLL)

激活函数总结&#xff08;二十三&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Piecewise Linear Unit激活函数2.2 Complementary Log-Log (CLL)激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU…

数学建模:BP神经网络模型及其优化

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 BP神经网络算法流程代码实现 神经网络的超参数优化代码实现 神经网络的分类 BP神经网络 算法流程 设 x 1 , x 2 , . . . , x i x_1,x_2,...,x_i x1​,x2​,...,xi​ 为输入变量&#xff0c; y y y…

图像分类学习笔记(六)——ResNeXt

一、要点 ResNeXt是ResNet的小幅升级&#xff0c;更新了block 左边&#xff08;ResNet的block/50/101/152层&#xff09;&#xff1a; 对于输入通道为256的特征矩阵&#xff0c;首先使用64个11的卷积核进行降维&#xff0c;再通过64个33的卷积核处理&#xff0c;再通过256个1…

volatile考点分析

今天我们学习并发编程中另一个重要的关键字volatile&#xff0c;虽然面试中它的占比低于synchronized&#xff0c;但依旧是不可忽略的内容。 关于volatile&#xff0c;我收集到了8个常见考点&#xff0c;围绕应用&#xff0c;特点和实现原理。 volatile有什么作用&#xff1f…

第六章:数据结构与算法-part2:数据的存储结构

文章目录 一、一般线性表存储1.1、线性表顺序存储1.2、线性表的链式存储1.2.1、 单链表1、单链表的存储2、单链表的基本操作的实现 1.2.2、双向链表 二、栈的存储结构2.1 顺序栈2.1.1、顺序栈的操作1、 初始化空栈2、插入3、删除操作pop4、获取栈顶元素 2.2 链栈 三、队列的存储…

精进面试技巧:如何在程序员面试中脱颖而出

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Docker harbor 私有仓库的部署和管理

目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 四、部署配置Docker Harbor 1. 首先需要安装 Docker-Compose 服务 2.部署 Harbor 服务 3.使用harbor仓库 &#xff08;1&#xff09;项目管理 &#xff08;2&#xff09;用户管理 一、什么是Harbor Harbor …

面试前的准备:程序员应该如何备战面试

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

JavaScript 开发的asp网页获取RFID读卡器以http协议Request提交的访问文件,Response回应驱动设备显示文字

本示例使用的设备&#xff1a; 液显WIFI无线网络HTTP协议RFID云读卡器可编程实时可控开关TTS语-淘宝网 (taobao.com) <%LANGUAGE"JavaScript" CODEPAGE"65001"%><% //格式化显示系统日期时钟 function formatDate(time){var date new Date(time…