poj3484详解(二分)
(一道思路不错的二分,但是这题比较难看懂,并且输入有点恶心!)
题目大概意思为每个数据给你 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详解(二分)相关推荐
- java二分排序法原理_Java常见排序算法详解—— 二分插入排序
转载请注明出处: 二分插入排序Binary Insert Sort 概念: 二分(折半)插入排序是一种在直接插入排序算法上进行小改动的排序算法.其与直接排序算法最大的区别在于查找插入位置时使用的是二分 ...
- 【算法】详解二分查找算法(思路很简单,细节是魔鬼)
我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of ...
- 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)
目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...
- java二分查找法_java算法之二分查找法的实例详解
java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...
- 二分算法详解:整数二分及浮点数二分算法(Binary Search)(含算法模板)
一.二分算法简介 当我们要从一个序列中查找一个元素的时候,最简单无脑的方法就是顺序查找法,但由于在大数据情况下爆炸的时间复杂度而舍弃. 最常见的方法是二分查找,也称折半查找(Binary Search ...
- 二分查找(折半查找)详解
二分查找详解 1. 二分查找的引入 2. 二分的一些基本知识 1) 定义 2) 特点 3. 二分查找的边界问题 1) 常用模板 2)综合练习 4.二分的应用 1) Flyer 2) Distribut ...
- python bisect_Python实现二分查找与bisect模块详解
前言 其实Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index()方法,其时间复杂度为O(n) .对于大数据量,则可以用二分查找进行优化 ...
- 二分查找算法详解(附代码)
二分查找算法详解(附代码) 注: 现有一个升序 不重复的数组 查询target是否在此数组中并返回序号 使用条件 使用二分算法的两个条件: 有序 不重复 混淆处 二分算法两种方式容易弄混淆的地方:就是 ...
- python实现二分查找代码+详解
python实现二分查找代码+详解 一.规定函数值 函数输入值 li=[1,2,3,4,5,6,7,8,9]#输入的集合 val=4#要查找的值 函数内部值 left=0#代表集合中第一个值的位置 r ...
最新文章
- Response.Redirect() 跳转中的ThreadAbortException
- %d 跟%i 的区别以及scanf和sscanf的用法
- 数塔 HDU - 2084
- 455. 分发饼干001(贪心算法+详解)
- React 与 可视化
- Django视图(python函数)
- org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory
- Java类class getClasses()方法及示例
- Java的守护线程Daemon
- MTK:串口学习和代码调试
- linux 使用yum给已安装的软件降级
- 最长回文子串问题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
- 从Slice_Header学习H.264(一)--片头语法元素介绍
- php xss漏洞扫描工具,XSS漏洞扫描器工具:XSpear
- c++primer5 3.17
- 2022全国水下机器人大赛国际线上赛来啦!“水下感知赛、通信赛”等你来战!
- ode45的常用和扩展用法
- 推荐的接口管理平台-yapi
- 基于HSV颜色空间的辅助车牌定位
- 如何用计算机算ln,如何用计算器算LN(对数)?
热门文章
- Three levels at which any machine carrying out an Information-Processing task must be understood
- 三周第三次课(11月1日) 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录
- Zookeeper开源客户端框架Curator的简单使用
- javascript addEventListener()
- ThreadPoolExecutor使用介绍
- [UIImage imageNamed:@]使用误区
- freetype和libiconv编译
- python中的tuple_python 数据类型 - tuple
- 模拟请求分页管理中地址转换和缺页中断处理_Linux内存管理:缺页异常(一)
- php怎么读取图片并输出,php读取图片内容并输出到浏览器的实现代码_PHP教程