(一道思路不错的二分,但是这题比较难看懂,并且输入有点恶心!)

题目大概意思为每个数据给你 n 组数,问这 n 组数中哪个数出现的次数为奇数(保证只有一个数)
每组数给的方式为 X , Y , Z
这组数即为 X , X + Z , X + 2 * Z , X + 3 * Z , … , X + K * Z , …(当 ( X + K * Z ) <= Y 时)

输入就不说了,到时候看代码

这道题我们这么考虑,因为除了所求的数 n ,其他所有数出现的次数都为偶数
那么 n + m 与 其之后的数出现的次数和,即为 偶数 + 偶数 + … + 偶数 = 偶数
那么 n 与 其之后的数出现的次数和,即为 奇数 + 偶数 + 偶数 + … + 偶数 = 奇数
那么 n - m 与其之后的数出现的次数和,即为 偶数 + … + 偶数 + 奇数 + 偶数 + … + 偶数 = 奇数

这么一看是不是就是最大化最小值的思路,找最大的数,使次数和为奇数,直接二分开始

代码如下:

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
typedef long long ll;
ll x[100005], y[100005], z[100005];
void trans(string str, int num)
{x[num] = 0; y[num] = 0; z[num] = 0;int i = 0;while(str[i] <= '9' && str[i] >= '0'){x[num] = x[num] * 10 + str[i] - '0';i++;}i++;while(str[i] <= '9' && str[i] >= '0'){y[num] = y[num] * 10 + str[i] - '0';i++;}i++;while(str[i] <= '9' && str[i] >= '0'){z[num] = z[num] * 10 + str[i] - '0';i++;}
}
ll deal(ll n, int k)
{ll m = 0, mm = 0;for(int i = 0; i < k; i++){ll sum = (y[i] - x[i]) / z[i] + 1;if(x[i] > n){mm += sum;}else if(y[i] < n){continue;}else{if((n - x[i]) % z[i] == 0){mm += sum - (n - x[i]) / z[i];m++;}else{mm += sum - (n - x[i]) / z[i] - 1;}}}if(mm % 2 == 1){return m;}else{return -1;}
}
int main()
{string str;while(getline(cin, str)){if(str == "") continue;int num = 0;trans(str, num++);while(getline(cin, str)){if(str == "") break;trans(str, num++);}ll l = 0, r = (1LL << 32), mid = (l + r) / 2;while(l < r - 1){if(deal(mid, num) != -1){l = mid;mid = (l + r) / 2;}else{r = mid;mid = (l + r) / 2;}}if(l == 0){printf("no corruption\n");}else{printf("%lld %lld\n", l, deal(l, num));}}
}

poj3484详解(二分)相关推荐

  1. java二分排序法原理_Java常见排序算法详解—— 二分插入排序

    转载请注明出处: 二分插入排序Binary Insert Sort 概念: 二分(折半)插入排序是一种在直接插入排序算法上进行小改动的排序算法.其与直接排序算法最大的区别在于查找插入位置时使用的是二分 ...

  2. 【算法】详解二分查找算法(思路很简单,细节是魔鬼)

    我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of ...

  3. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  4. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  5. 二分算法详解:整数二分及浮点数二分算法(Binary Search)(含算法模板)

    一.二分算法简介 当我们要从一个序列中查找一个元素的时候,最简单无脑的方法就是顺序查找法,但由于在大数据情况下爆炸的时间复杂度而舍弃. 最常见的方法是二分查找,也称折半查找(Binary Search ...

  6. 二分查找(折半查找)详解

    二分查找详解 1. 二分查找的引入 2. 二分的一些基本知识 1) 定义 2) 特点 3. 二分查找的边界问题 1) 常用模板 2)综合练习 4.二分的应用 1) Flyer 2) Distribut ...

  7. python bisect_Python实现二分查找与bisect模块详解

    前言 其实Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index()方法,其时间复杂度为O(n) .对于大数据量,则可以用二分查找进行优化 ...

  8. 二分查找算法详解(附代码)

    二分查找算法详解(附代码) 注: 现有一个升序 不重复的数组 查询target是否在此数组中并返回序号 使用条件 使用二分算法的两个条件: 有序 不重复 混淆处 二分算法两种方式容易弄混淆的地方:就是 ...

  9. python实现二分查找代码+详解

    python实现二分查找代码+详解 一.规定函数值 函数输入值 li=[1,2,3,4,5,6,7,8,9]#输入的集合 val=4#要查找的值 函数内部值 left=0#代表集合中第一个值的位置 r ...

最新文章

  1. Response.Redirect() 跳转中的ThreadAbortException
  2. %d 跟%i 的区别以及scanf和sscanf的用法
  3. 数塔 HDU - 2084
  4. 455. 分发饼干001(贪心算法+详解)
  5. React 与 可视化
  6. Django视图(python函数)
  7. org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory
  8. Java类class getClasses()方法及示例
  9. Java的守护线程Daemon
  10. MTK:串口学习和代码调试
  11. linux 使用yum给已安装的软件降级
  12. 最长回文子串问题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
  13. 从Slice_Header学习H.264(一)--片头语法元素介绍
  14. php xss漏洞扫描工具,XSS漏洞扫描器工具:XSpear
  15. c++primer5 3.17
  16. 2022全国水下机器人大赛国际线上赛来啦!“水下感知赛、通信赛”等你来战!
  17. ode45的常用和扩展用法
  18. 推荐的接口管理平台-yapi
  19. 基于HSV颜色空间的辅助车牌定位
  20. 如何用计算机算ln,如何用计算器算LN(对数)?

热门文章

  1. Three levels at which any machine carrying out an Information-Processing task must be understood
  2. 三周第三次课(11月1日) 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录
  3. Zookeeper开源客户端框架Curator的简单使用
  4. javascript addEventListener()
  5. ThreadPoolExecutor使用介绍
  6. [UIImage imageNamed:@]使用误区
  7. freetype和libiconv编译
  8. python中的tuple_python 数据类型 - tuple
  9. 模拟请求分页管理中地址转换和缺页中断处理_Linux内存管理:缺页异常(一)
  10. php怎么读取图片并输出,php读取图片内容并输出到浏览器的实现代码_PHP教程