二分和三分

希望能整理出二分和三分的模板

整数的二分

题目

Uva

题意

  • 有n件物品,每件物品有四个参数type, name, price, quality
  • 每一个type中挑选一个物品,并且所有type的price之和不能超过预算b。
  • 满足上述条件的基础之上,似的quality最大。

题解

二分quality

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <bits/stdc++.h>
using namespace std;
int cnt;
map<string, int> id;
int ID(string name){
if(!id.count(name)) return id[name] = cnt++;
return id[name];
}
const int maxn = 1e3+10;
struct Node{
int quality;
int price;
};
int n, b;
vector<Node> comp[maxn];
bool ok(int q){
int sum = 0;
for(int i=0; i<cnt; i++){
int sz = comp[i].size();
int price = b+1;
for(int j=0; j<sz; j++){
if(comp[i][j].quality>=q){
price = min(price, comp[i][j].price);
}
}
if(price == b+1) return false;
sum+=price;
if(sum>b) return false;
}
return true;
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &b);
cnt = 0;
for(int i=0; i<maxn; i++) comp[i].clear();
id.clear();
int maxq;
for(int i=0; i<n; i++){
char name[30], type[30];
int price, quality;
scanf("%s%s%d%d", type, name, &price, &quality);
maxq = max(maxq, quality);
comp[ID(type)].push_back((Node){quality, price});
}
int L = 0, R = maxq;
while(L<R){
int M = L + (R-L+1)/2;
if(ok(M))L = M;
else R = M-1;
}
printf("%d\n", L);
}
return 0;
}

小数的二分

题目

题意

  • n个蛋糕, f个朋友
  • 将n个蛋糕分成f+1份,每份不能拼凑。
  • 问每个人分得最大的蛋糕的面积

题解

二分面积即可

AC代码

一开始吧PI定义为float WA成傻逼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>
using namespace std;
int n, f;
const int maxn = 1e4+10;
int number[maxn];
double area[maxn];
const double PI = acos(-1.0);
bool ok(double s){
int sum = 0;
for(int i=0; i<n; i++){
sum += floor(area[i]/s);
}
if(sum>=f+1) return true;
else return false;
}
int main()
{
int T;
scanf("%d", &T);
//freopen("data.out","w",stdout);
while(T--){
scanf("%d%d", &n, &f);
double max_area = -1;
for(int i=0; i<n; i++){
scanf("%d", &number[i]);
area[i] = number[i]*number[i]*PI;
max_area = max(max_area, area[i]);
}
double L=0, R = max_area;
while(R-L>1e-7){
double M = (R+L)/2.0;
if(ok(M))L = M;
else R = M;
}
printf("%.4lf\n", L);
}
return 0;
}

三分求峰值函数的极值或者整数的值

未解决的问题

文章目录
  1. 1. 整数的二分
    1. 1.1. 题目
    2. 1.2. 题意
    3. 1.3. 题解
    4. 1.4. AC代码
  2. 2. 小数的二分
    1. 2.1. 题目
    2. 2.2. 题意
    3. 2.3. 题解
    4. 2.4. AC代码
  3. 3. 三分求峰值函数的极值或者整数的值
  4. 4. 未解决的问题
{{ live2d() }}