• 二分搜索


    poj1064http://poj.org/problem?id=1064

    浮点数最好不要设ub-lb>eps,不好掌握。注意printf(%.2lf",...)是四舍五入,这里不行所以要先取证floor

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cstdlib>
     6 #include<cmath>
     7 #define lson l, m, rt<<1
     8 #define rson m+1, r, rt<<1|1
     9 #define IO ios::sync_with_stdio(false);cin.tie(0);
    10 #define INF 1e9
    11 #define MAXN 10010
    12 const int MOD=1e9+7;
    13 typedef long long ll;
    14 using namespace std;
    15 int n, k; 
    16 double a[MAXN];
    17 int C(double x)
    18 {
    19     int num = 0;
    20     for(int i = 0; i < n; i++){
    21         num += (int)(a[i]/x);
    22     }
    23     return num >= k;
    24 }
    25 void solve()
    26 {
    27     double lb=0, ub=INF;
    28     for(int i = 0; i < 100; i++){//这里限定次数而不是限定ub-lb>EPS,因为EPS设置不好会陷入死循环 
    29         double mid = (lb+ub)/2; 
    30         if(C(mid)){//左闭右开 
    31             lb = mid;
    32         } 
    33         else ub = mid;
    34     }
    35     printf("%.2lf
    ", floor(lb*100)/100);//floor是向下取整,但似乎返回的还是原类型(这里即double),如果直接输出ub则是四舍五入 
    36 }
    37 int main()
    38 { 
    39     IO;
    40     cin >> n >> k;
    41     for(int i = 0; i < n; i++){
    42         cin >> a[i];
    43     }
    44     solve();
    45     return 0;
    46 }

     poj2456http://poj.org/problem?id=2456

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cstdlib>
     6 #include<cmath>
     7 #define lson l, m, rt<<1
     8 #define rson m+1, r, rt<<1|1
     9 #define IO ios::sync_with_stdio(false);cin.tie(0);
    10 #define INF 1e9
    11 #define MAXN 10010
    12 const int MOD=1e9+7;
    13 typedef long long ll;
    14 using namespace std;
    15 int n, m, a[100010];
    16 int C(int x)
    17 {
    18     int crt=0, last=0;
    19     for(int i = 1; i < m; i++){//注意这里因为默认第一头奶牛放在第一个牛舍,所以计数从1开始 
    20         crt=last+1;
    21         while(crt<n&&a[crt]-a[last]<x){
    22             crt++;
    23         }
    24         last=crt;
    25         if(crt==n) return 0;
    26     }
    27     return 1;
    28 }
    29 void solve()
    30 {
    31     sort(a, a+n);
    32     int lb=0, ub=INF;
    33     while(ub-lb>1){
    34         int mid = (lb+ub)>>1;
    35         if(C(mid)){//左闭右开 
    36             lb = mid;
    37         }
    38         else ub = mid;
    39     }
    40     cout << lb << endl;
    41 }
    42 int main()
    43 {
    44     cin >> n >> m;
    45     for(int i = 0; i < n; i++){
    46         cin >> a[i];
    47     } 
    48     solve();
    49     return 0;
    50 }
  • 相关阅读:
    690. 员工的重要性
    【递推算法】
    【数据排序】快速排序
    【数据排序】车厢重组
    【基本算法--高精度计算】大整数相加
    【基本算法--高精度计算】回文数
    高精度计算 除法 高精除以低精
    PReLU
    重学C++(1)
    概率论基础知识回顾(1)
  • 原文地址:https://www.cnblogs.com/Surprisezang/p/8608043.html
Copyright © 2020-2023  润新知