mid格式

计蒜客习题:帕吉的肉钩

拈花ヽ惹草 提交于 2020-03-07 10:17:27
题目: 在 DotA 游戏中,帕吉的肉钩是很多英雄最害怕的东西。钩子由连续若干段的等长金属棒制成。 现在帕吉对钩子由一些操作: 我们将金属棒 1~n 依次编号,帕吉可以把编号 x~y 的金属棒变成铜棒、银棒、金棒。 每段铜棒的价值是 1;每段银棒的价值是 2;每段金棒的价值是 3。 肉钩的总价值是 n 段金属棒价值之和。 帕吉想知道若干操作以后钩子的总价值。 输入格式 第一行一个整数 N(1≤N≤10^5),表示肉钩金属棒的数量,初始状态为 铜棒。 第二行一个整数 Q(1≤Q≤10^5),表示操作数。 接下来 Q 行,一行三个整数,X,Y,Z(1≤X≤Y≤N,1≤Z≤3) 输出格式 一行一个整数,表示钩子的总价值,用样例中的格式。 样例输入 10 2 1 5 2 5 9 3 1 2 3 4 样例输出 The total value of the hook is 24. AC代码:线段树区间更新 #include<iostream> using namespace std; const int MAX_N = 10010; int s[100005 * 4],col[100005 * 2]; void up(int p){ s[p] = s[p * 2] + s[p * 2 + 1]; } void down(int p,int l,int r){ if(col[p]){ int

二分查找

为君一笑 提交于 2020-03-01 09:57:50
1,定义 二分查找也称折半查找,前提是线性表中的记录必须是有序的(通常从小到大有序) ,线性表必须采用顺序存储,它是一种效率较高的查找方法。 2,基本思想 (1)在有序表中,取中间数据作为比较对象,若给定值与中间记录的关键字相 等,则查找成功; (2)若给定值小于中间记录的关键字,则在中阔记录的左半区继续查找; (3)若给定值大于中间记录的关键字,则在中间记录的右半区继续查找; (4)不断重复上述过程,直到查找成功,或所有查找区域元记录,查找失败为止。 3,实现代码 int BinarySearch ( int * a , int length , int key ) { int low = 1 ; int high = length ; int mid ; while ( low <= high ) { mid = ( low + high ) / 2 ; if ( key < a [ mid ] ) high = mid - 1 ; else if ( key > a [ mid ] ) low = mid + 1 ; else return mid ; } return 0 ; } 例题: 《切绳子》 描述: 有n条绳子,长度分别为L[i]。如果从他们中切割出k条长度相同的绳子的话,这k条绳子每条最长能有多长?(答案保留小数点后两位,规定1单位长度的绳子最多可以切割成100份

[POI2011]Lightning Conductor

心不动则不痛 提交于 2020-01-30 18:39:20
题目描述 Progressive climate change has forced the Byteburg authorities to build a huge lightning conductor that would protect all the buildings within the city. These buildings form a row along a single street, and are numbered from to . The heights of the buildings and the lightning conductor are non-negative integers. Byteburg's limited funds allow construction of only a single lightning conductor. Moreover, as you would expect, the higher it will be, the more expensive. The lightning conductor of height located on the roof of the building (of height ) protects the building (of height ) if the

AcWing 790.数的三次方根

一个人想着一个人 提交于 2020-01-27 17:48:01
AcWing 790.数的三次方根 题目描述 给定一个浮点数n,求它的三次方根。 输入格式 共一行,包含一个浮点数n。 输出格式 共一行,包含一个浮点数,表示问题的解。 注意,结果保留6位小数。 数据范围 −10000≤n≤10000 输入样例 1000.00 输出样例 10.000000 题目思路 采用浮点数的二分思想 #include<bits/stdc++.h> using namespace std; const double eps = 1e-8; double check(double n) { return n*n*n; } int main() { double n; scanf("%lf",&n); double l=-1e4,r=1e4; while(r-l>eps) { double mid = (l+r)/2; if(check(mid)>n)r=mid; else l=mid; } printf("%lf",l); return 0; } 来源: https://www.cnblogs.com/fsh001/p/12236378.html

数的三次方根

青春壹個敷衍的年華 提交于 2020-01-21 03:00:38
给定一个浮点数n,求它的三次方根。 输入格式 共一行,包含一个浮点数n。 输出格式 共一行,包含一个浮点数,表示问题的解。 注意,结果保留6位小数。 数据范围 −10000≤n≤10000 输入样例: 1000.00 输出样例: 10.000000 二分,只是数的三次方有负数 # include <iostream> # include <algorithm> using namespace std ; int main ( ) { double a ; cin >> a ; double l = - 10000.0 , r = 10000.0 , mid ; while ( r - l > 0.0000001 ) { mid = ( l + r ) / 2 ; if ( mid * mid * mid > a ) r = mid ; else if ( mid * mid * mid < a ) l = mid ; else break ; } printf ( "%lf\n" , mid ) ; return 0 ; } 来源: CSDN 作者: 你好哇_ 链接: https://blog.csdn.net/weixin_44828107/article/details/104053832

以区间为单位的二分查找

。_饼干妹妹 提交于 2020-01-21 01:24:51
【2019回家过年前的一记】 问题场景: 区间的格式如下,整体为一个Json字符串,每个区间的startTime和endTime都是按照从小到大的顺序排列的。 "[{\"endTime\":1578633955,\"startTime\":1578626876},{\"endTime\":1578640268,\"startTime\":1578634050},{\"endTime\":1578642086,\"startTime\":1578640291},{\"endTime\":1578643084,\"startTime\":1578642639}]" 现在给定一个用户需要查找的时间段: "startTime":1578585600, "endTime":1578644000 要求:返回该时间段内的所有区间,若查找的时间点位于某个区间中间,需要对该区间进行分割只返回所需要的那一段。 代码思路: ●首先将每个小区间的startTime和endTime依次存入一个数组中; ●使用二分查找该数组快速确定用户请求的时间段与原始区间的交集起始点位置index; ●从该位置开始将符合要求的区间依次放入新的json串中,期间需要对首尾两个区间进行特殊处理 【0,1】【2,3】【4,5】【6,7】 begin=0,end=7,mid=3 因为小区间都是两个元素,故mid在最后一步

算法Notes

偶尔善良 提交于 2020-01-18 10:17:28
算法Notes:求解逆序对数 //跟随大神学算法,自己整理的笔记。// 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。 输入格式 第一行包含整数n,表示数列的长度。 第二行包含 n 个整数,表示整个数列。 输出格式 输出一个整数,表示逆序对的个数。 数据范围 1≤n≤100000 输入样例: 6 2 3 4 5 6 1 输出样例: 5 思路解析 借助归并排序求出数组中的逆序对数。 归并排序, 以 mid (=[l+r] /2 )为分界点,将数组份为左右两部分,Left 和 Right。 然后分别进行递归Left 和 Right 。求出逆序对数。 最后归并,将左右两个有序序列合并成一个有序数组。 逆序对分三种情况: 同时在左半边 /////// L_____i_____j______mid , 左半边逆序对数量:merge_sort(L,mid) 同时在右半边 mid+1_____i_____j______R , 右半边逆序对数量:merge_sort(mid+1,R) 一个在左半边,另一个在右半边 /////// L_____i___________mid mid+1_________j_______R 如果q[i] >q[j]

[洛谷P2824] HEOI2016/TJOI2016 排序

ぐ巨炮叔叔 提交于 2020-01-14 11:53:03
问题描述 在 2016 年,佳媛姐姐喜欢上了数字序列。因而她经常研究关于序列的一些奇奇怪怪的问题,现在她在研究一个难题,需要你来帮助她。 这个难题是这样子的:给出一个 1 到 n 的排列,现在对这个排列序列进行 m 次局部排序,排序分为两种: 0 l r 表示将区间 [l,r] 的数字升序排序 1 l r 表示将区间 [l,r] 的数字降序排序 注意,这里是对 下标 在区间 [l,r] 内的数排序。 最后询问第 q 位置上的数字。 输入格式 输入数据的第一行为两个整数 n 和 m,n 表示序列的长度,m 表示局部排序的次数。 第二行为 n 个整数,表示 1 到 n 的一个排列。 接下来输入 m 行,每一行有三个整数 $ \text{op},l,r \(,\) \text{op}$ 为 0 代表升序排序, \(\text{op}\) 为 1 代表降序排序, l,r 表示排序的区间。 最后输入一个整数 q,表示排序完之后询问的位置。 输出格式 输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第 q 位置上的数字。 样例输入 6 3 1 6 2 5 3 4 0 1 4 1 3 6 0 2 4 3 样例输出 5 说明 河北省选2016第一天第二题。 对于 30% 的数据, \(n,m\leq 1000\) 对于 100% 的数据, \(n,m\leq 10^5\) , \(1

数的三次方根

女生的网名这么多〃 提交于 2019-12-11 04:35:41
给定一个浮点数n,求它的三次方根。 输入格式 共一行,包含一个浮点数n。 输出格式 共一行,包含一个浮点数,表示问题的解。 注意,结果保留6位小数。 数据范围 − 10000 ≤ n ≤ 10000 −10000≤n≤10000 − 1 0 0 0 0 ≤ n ≤ 1 0 0 0 0 输入样例: 1000.00 输出样例 : 10.000000 # include <iostream> # include <cstdio> using namespace std ; int main ( ) { double x ; cin >> x ; double l = - 1000 , r = 1000 ; while ( r - l > 1e-8 ) { double mid = ( l + r ) / 2 ; if ( mid * mid * mid >= x ) { r = mid ; } else { l = mid ; } } printf ( "%lf\n" , l ) ; return 0 ; } 来源: CSDN 作者: qq_52051345 链接: https://blog.csdn.net/qq_43469554/article/details/103465413

luogu P1316 丢瓶盖 |二分答案

心不动则不痛 提交于 2019-12-04 07:57:04
题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入格式 第一行,两个整数,A,B。(B<=A<=100000) 第二行,A个整数,分别为这A个瓶盖坐标。 输出格式 仅一个整数,为所求答案。 一道练习二分的经典例题 #include<iostream> #include<cstdio> #include<algorithm> #define ll long long using namespace std; ll f[100001];ll a,b; bool check(ll x) { ll ans=0,last=-(1<<30); for(int i=1;i<=a;i++) { if(f[i]-last>=x) { // cout<<i<<" "; last=f[i]; ans++; if(ans>=b)return 1; } } return 0; } int main() { cin>>a>>b; ll ansmax=0; for(int i=1;i<=a;i++) { scanf("%lld",&f[i]); ansmax=max(ansmax,f[i]); } sort(f+1,f+a+1); ll l=0,r=ansmax+1;