二分题目总结

在UVA上搜索二分时搜到了一个很好的public专题

1.POJ - 3258 River Hopscotch

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16277

解题思路:http://blog.csdn.net/l123012013048/article/details/45646911

这题是符合条件的情况下,解有可能是偏小的

2.POJ - 3273 Monthly Expense

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=14546

解题思路:http://blog.csdn.net/l123012013048/article/details/45648269

这题是符合条件的状况下,解是偏大的的

3.POJ - 3104 Drying

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16416

解题思路:http://blog.csdn.net/l123012013048/article/details/45652769

4.POJ - 2976 Dropping tests

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17097

解题思路:http://blog.csdn.net/l123012013048/article/details/45675971

5.POJ - 3111 K Best

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=39448

解题思路:http://blog.csdn.net/l123012013048/article/details/45672533

6.POJ - 3579 Median

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24230

解题思路:http://blog.csdn.net/l123012013048/article/details/45675807

7.POJ - 3685 Matrix

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24239

题目大意:给出一个n * n的矩阵,其中Aij = i * i + 100000 × i + j * j - 100000 × j + i × j,求这个矩阵中第M小的数是多少

解题思路:二分求地M小的数

观察这个式子,可以发现随着i增加,Aij也相应的增加,有这个性质可以判断一下有多少每一列有多少个是小于等于这个数的了

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
ll N, M;

ll Count(int i, int j) {
    return ll(i + 100000 + j) * i + ll(j - 100000) * j;
}

bool judge(ll mid) {
    ll cnt = 0;
    for(int j = 1; j <= N; j++) {
        int l = 1, r = N;
        while(l <= r) {
            int Mid = (l + r) / 2;
            if( Count(Mid,j) <= mid)
                l = Mid + 1;
            else
                r = Mid - 1;
        }
        cnt += l - 1;
    }
    return cnt < M;
}

ll solve() {
    ll l = -((ll)N * N * 3 + 100000 * N) , r = (ll)N * N * 3 + 100000 * N;

    while(l <= r) {
        ll mid = (l + r) / 2;
        if(judge(mid))
            l = mid + 1;
        else
            r = mid - 1;
    }
    return l;
}

int main(){
    int test;
    scanf("%d", &test);
    while(test--) {
        scanf("%lld%lld", &N, &M);
        printf("%lld\n",solve());
    }
    return 0;
}

8.POJ - 3484 Showstopper

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=15091

题目大意:有n组 X Y Z的组合,X Y Z组合可以输出X , X + Z , X + 2 Z , … X + K Z(X + K * Z <= Y)

要求你找出那个输出次数为奇数的数,并求出输出了几次

解题思路:那个输出奇数次的数之前的数的总和肯定为偶数,也就是说他是满足这样的规律的

偶偶偶偶偶偶奇奇奇。。。先偶数后奇数的

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 50010
typedef long long ll;
ll X[maxn], Y[maxn], Z[maxn];
int cnt;
char str[maxn];

ll judge(ll mid) {
    ll Sum = 0;
    for(int i = 0; i < cnt; i++) {
        if(mid < X[i])
            continue;
        ll t = min(mid, Y[i]);
        Sum += (t - X[i])/ Z[i] + 1;
    }
    return Sum;
}

void solve() {
    cnt = 1;
    X[0] = 0;
    sscanf(str,"%lld%lld%lld", &X[0], &Y[0], &Z[0]);
    if(!X[0])
        return ;

    while(gets(str) && str[0]) {
        sscanf(str,"%lld%lld%lld", &X[cnt], &Y[cnt], &Z[cnt]);
        cnt++;
    }

    ll l = 0, r = 1LL << 32;
    while(l < r) {
        ll mid = (l + r) / 2;
        if(judge(mid) % 2)
            r = mid;
        else
            l = mid + 1;
    }
    if(l == (1LL << 32))
        printf("no corruption\n");
    else
        printf("%lld %lld\n",l, judge(l) - judge(l - 1));
}

int main() {
    while(gets(str))
        solve();
    return 0;
}
时间: 2024-08-06 03:43:38

二分题目总结的相关文章

二分题目总结(未完待续)

二分的用处太大了,不管是求简单的方程,还是求最优解方面都是不错的解题思想. 只要在线性,顺序或者有序的数据里就可以用二分来找最优的答案,而且时间平均都是O(log2 n).题目中好像是HDU 4190吧,这题的限时是10000ms,而用二分做才用时1000ms,其优点可想而知. 不过就像<编程珠玑>中说的一样,虽然二分思路及其做法很爽,但是编写二分的程序总是错漏百出的.二分的第一个程序出现在1942年,但是直到1962年出出现了第一个没有bug的二分程序,其编写正确难度可想而知. 解题技巧:

二分题目

题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选 择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点. 为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳 跃距离尽可能长.由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能 移走起点和终点的岩石). 刚开始看好久,典型的

二分 题目 压缩打包 Special Judge? 不不不 当然不是

http://noi.openjudge.cn/ch0111/ No 题目 分数 01 查找最接近的元素 10 3176 02 二分法求函数的零点 10 2181 03 矩形分割 10 1420 04 网线主管 10 1648 05 派 10 1581 06 月度开销 10 1449 07 和为给定数 10 1906 08 不重复地输出数 10 1790 09 膨胀的木棍 10 768 10 河中跳房子 10 2027 ------------------------------萌萌的分割线--

UVA10183 - How Many Fibs?(java大数+二分)

UVA10183 - How Many Fibs?(java大数+二分) 题目链接 题目大意:给你a,b,求[a,b]之间有多少个fibs数. 解题思路:虽然a.b很大,但是在10^100内的fibs却不超过500个.这样就可以先把这些fibs保存在数组中,然后每次二分去找a,b的位置,然后就可以得到之间有多少个fibs. 代码: import java.util.*; import java.math.*; import java.io.*; import java.lang.String.*

POJ 3621(0/1分数规划,二分) Sightseeing Cows

题意 给一个n个点m条边的图,每一个点和每一条边都有权值.现在要找一个环的点权和/边权和最大,求这个最大值. 思路 SPFA+二分 题目的关系式:点权和/边权和 <= ans 转换一下就变成 ans*边权和 - 点权和 >= 0; 二分答案,然后用SPFA去check是否存在一个负权回路. 参考code: /* #pragma warning (disable: 4786) #pragma comment (linker, "/STACK:0x800000") */ #in

[SinGuLaRiTy] 分治题目复习

[SInGuLaRiTy-1025] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 1905] 棍的扩张 (Expanding Rods) 题目描述 已知一根长为L的细棍被加热了n摄氏度,那么其新的长度为L'=(1+n*C)*L.中间的C是热膨胀系数.当一根细棍被夹在两面墙中间然后被加热,它会膨胀,其形状会变成一个弧,而原来的细棍(加热前的细棍)就是这个弧所对的弦.你的任务是计算出弧的中点与弦的中点的距离. 输入 包含多组数

UVA10277 - Boastin&#39; Red Socks(枚举+二分)

UVA10277 - Boastin' Red Socks(枚举+二分) 题目链接 题目大意:现在有m只红袜子,n只黑袜子,这样总袜子total = n + m;现在给你p, q,确定n和m,使得从这些袜子中取两只都是红袜子的概率等于p/q:如果没有这样的n和m满足要求输出impossible; 解题思路:m *(m - 1) / (total * (total - 1)) = p /q; 那么我们只需要枚举total,就可以解到m.但是会有精度误差,貌似有解决的办法,但是觉得没法理解.后面看了

CUGBACM_Summer_Tranning3 2013长沙现场赛(二分+bfs模拟+DP+几何)

A题:二分 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 用lower_bound可以轻松解决,不过比赛的时候逗逼了. 刚开始没有预处理,所以队友给出一组数据的时候没通过,然后一时紧张又想不出什么好的解决办法,所以就没再继续敲代码.实在有点可惜了. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #includ

LightOJ 1088 Points in Segments 二分查找

1088 - Points in Segments PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Given n points (1 dimensional) and q segments, you have to find the number of points that lie in each of the segments. A point pi will lie in a segme