『一本通』二分与三分

愤怒的牛

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,ans,a[100005];
 4
 5 int check(int x) {
 6     int cnt=1,lst=a[1];
 7     for(int i=2;i<=n;i++)
 8      if(a[i]-lst>=x) cnt++,lst=a[i];
 9     return cnt;
10 }
11
12 int main() {
13     scanf("%d%d",&n,&m);
14     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
15     sort(a+1,a+n+1);
16     int l=1,r=a[n]-a[1];
17     while(l<=r) {
18         int Mid=l+r>>1;
19         if(check(Mid)>=m) l=Mid+1,ans=Mid;
20         else r=Mid-1;
21     }
22     printf("%d",ans);
23 }

Best Cow Fences

 1 #include<bits/stdc++.h>
 2 #define N 100005
 3 using namespace std;
 4 int n,L,ans,a[N];
 5 long long s[N];
 6
 7 bool check(int x) {
 8     for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]-x;
 9     long long Min=0;
10     for(int i=L;i<=n;i++) {
11         Min=min(Min,s[i-L]);
12         if(s[i]>=Min) return 1;
13     }
14     return 0;
15 }
16
17 int main() {
18     scanf("%d%d",&n,&L);
19     int l=0,r=0;
20     for(int i=1;i<=n;i++) {
21         scanf("%d",&a[i]);
22         a[i]*=1000,r=max(r,a[i]);
23     }
24     while(l<=r) {
25         int Mid=l+r>>1;
26         if(check(Mid)) l=Mid+1,ans=Mid;
27         else r=Mid-1;
28     }
29     printf("%d",ans);
30 }
31 /*
32 二分枚举平均值ave。
33 将每个数减去ave,看是否有长度不小于L的连续区间,使得这段区间的和大于等于0。
34 */

数列分段II

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,a[100005];
 4
 5 bool check(int x) {
 6     int cnt=1,sum=a[1];
 7     for(int i=2;i<=n;i++) {
 8         sum+=a[i];
 9         if(sum>x) cnt++,sum=a[i];
10         if(cnt>m) return 0;
11     } return 1;
12 }
13
14 int main() {
15     scanf("%d%d",&n,&m);
16     int l=0,r=0;
17     for(int i=1;i<=n;i++) {
18         scanf("%d",&a[i]);
19         l=max(l,a[i]),r+=a[i];
20     }
21     while(l<=r) {
22         int Mid=l+r>>1;
23         if(check(Mid)) r=Mid-1;
24         else l=Mid+1;
25     }
26     printf("%d",l);
27 }
28 //二分答案

曲线

 1 #include<bits/stdc++.h>
 2 #define eps 1e-10
 3 using namespace std;
 4 int T,n;
 5 struct node{double a,b,c;}s[100005];
 6 inline int read() {
 7     int x=0,f=1; char c=getchar();
 8     while(c<‘0‘||c>‘9‘) {if(c==‘-‘)f=-1; c=getchar();}
 9     while(c>=‘0‘&&c<=‘9‘) x=(x<<3)+(x<<1)+c-‘0‘,c=getchar();
10     return x*f;
11 }
12 double F(double x) {
13     double f=-1e10;
14     for(int i=1;i<=n;i++)
15      f=max(f,s[i].a*x*x+s[i].b*x+s[i].c);
16     return f;
17 }
18
19 int main() {
20     T=read();
21     while(T--) {
22         n=read();
23         for(int i=1;i<=n;i++)
24          s[i]=(node){read(),read(),read()};
25         double l=0,r=1000;
26         while(l+eps<=r) {
27             double Mid=(l+r)/2;
28             if(F(Mid)>=F(Mid+eps)) l=Mid;
29             else r=Mid;
30         }
31         printf("%.4lf\n",F(l));
32     }
33 }
34 //二分枚举x 

原文地址:https://www.cnblogs.com/qq8260573/p/10331491.html

时间: 2024-08-29 00:23:01

『一本通』二分与三分的相关文章

『一本通』区间DP

石子合并 1 #include<bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 using namespace std; 4 int n,sm[505][505],bg[505][505],sum[505]; 5 inline int read() { 6 int x=0,f=1; char c=getchar(); 7 while(c<'0'||c>'9') {if(c=='-')f=-1; c=getchar();} 8 while(c>

『一本通』广搜的优化技巧

Knight Moves 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int dx[9]={2,2,1,1,-1,-1,-2,-2},dy[9]={-1,1,-2,2,-2,2,-1,1}; 4 int n,L,step[305][305]; 5 struct node{int x,y;}b,e; 6 queue<node>q; 7 bool check(int x,int y) {return x>=0&

『一本通』哈希和哈希表

Oulipo 1 #include<bits/stdc++.h> 2 #define N 1000000+5 3 using namespace std; 4 typedef unsigned long long ULL; 5 const int b=55; 6 ULL n,m,s,ans,p[N],sum[N]; 7 char s1[N],s2[N]; 8 9 int main() { 10 scanf("%s",s1+1),scanf("%s",s2

『一本通』差分约束系统

Intervals 设$s[k]$表示$0$~$k$之间最少选出多少个整数. 由题得$s[b_i]-s[a_i-1]\ge c_i$,$0\le s[k+1]-s[k] \le 1$ . 根据关系式连边,$SPFA$ 跑一遍 最长路 即可. #include<bits/stdc++.h> using namespace std; const int N=5e4+5; int n,cnt,Min,Max,fro[N],dis[N]; bool vis[N]; struct edge{int to

【信息学奥赛一本通】Part1.2 基础算法-二分与三分

问题 A: [二分和三分]愤怒的牛 题目描述 农夫约翰建造了一座有n间牛舍的小屋,牛舍排在一条直线上,第i间牛舍在xi的位置,但是约翰的m头牛对小屋很不满意,因此经常互相攻击.约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其它牛尽可能远的牛舍.也就是要最大化最近的两头牛之间的距离. 牛们并不喜欢这种布局,而且几头牛放在一个隔间里,它们就要发生争斗.为了不让牛互相伤害.John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是多少呢? 输入 第一行用空格分

『转』数学专辑

1.burnside定理,polya计数法 这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能完全看懂了,理解了再去做题,不要只记个公式. *简单题:(直接用套公式就可以了) pku2409 Let it Bead   http://acm.pku.edu.cn/JudgeOnline/problem?id=2409 pku2154 Color http://acm.pku.edu.cn/JudgeOnline/problem?id=2154 pku12

二分与三分(精度类型)

二分:传送门 三分:传送门 (注意,是五舍六入,不是四舍五入,在2018年10月23日前是这样的) 话说一本通上不是有讲嘛,做法自己看吧...(但是我太弱了,精度版看不懂QWQ). 简单讲一下二分与三分吧. 二分:必须满足单调性: 非增或非减就叫单调性(如果就好几个数相同,一般会用二分来找第一个数或最后一个数). 我们用两个数字l与r来代表搜索范围,而mid代表中间的位置的值,来跳来跳去,看情况来写. 如这题 int l=1,r=n,mid,ans=0; while(l<=r) { mid=(l

二分与三分

(写的很早忘了发布了...)今天高二的学长学姐们进行了二分和三分的测试(又名一本通课后题测试),感觉这个好有意思~ 关于什么是二分,三分,先咕咕咕了,来看一道题. 灯泡:https://loj.ac/problem/10016 题意概述:给出$H,h,D$,求阴影的最长长度(包括地上的和墙上的). 有种初中数学的既视感. 解:设灯泡为$A$,人头为$B$,连接$AB$并延长,与地面的延长线交于点$C$. 于是就结束了...吗? 还有一种可能就是影子并没有到墙上去,但是影响不大,两个函数叠加起来还

『ENGLISH』

以A字母开头的词汇 英文 中文 abstract module 抽象模组 access 访问.存取 access control 存取控制 access control information 存取控制资讯 access mechanism 存取机制 access rights 存取权限 accessibility 无障碍性 accessibility information 无障碍网页资讯 accessibility problem 无障碍网页问题 accessible 无障碍的 access