T044 二分搜索(含鬼畜压行写法)

用二分的前提是数据已经升序排好,切记切记

#include<stdio.h>

int BSearch(int A[],int n,int key)//A[]存放数据的数组;n数据个数;key要搜索内容
{
    int l, r, m;
    l=0,r=n-1;
    while(l<=r)
    {
        m=l+(r-l)/2;//不用(l+r)/2避免数据溢出
        if(A[m]<key)//向右查找
            l=m+1;
        else if(A[m]>key)//向左查找
            r=m-1;
        else return m;//找到
    }
    return -1;
}

int binSearch(int a[], int begin, int end, int k)//比较鬼畜的写法。。压行不是梦。。
{
    int mid = begin + ( (end - begin)>>1 ),index;
    index = a[mid] < k && begin + 1 <= end ? binSearch(a,mid+1,end,k) :
          ( a[mid] > k && begin + 1 <= end ? binSearch(a,begin,mid,k) :
            mid * (a[mid] == k) + (a[mid] != k)*(-1));
    return index;
}

int main()
{
    int n, i, key, result, result1;
    int A[100];
    scanf("%d", &n);
    for(i=0;i<n;i++)
    {
        scanf("%d", &A[i]);
    }
    scanf("%d", &key);
    result=BSearch(A,n,key);
    result1=binSearch(A,0,n-1,key);
    if(result>=0) printf("%d\n", result);//下标大于等于0即找到该数据
    else puts("null");
    if(result1>=0) printf("%d\n", result1);
    else printf("null\n");
    return 0;
}
时间: 2024-08-05 19:37:01

T044 二分搜索(含鬼畜压行写法)的相关文章

【BZOJ 3735】苹果树 树上莫队(树分块+离线莫队+鬼畜的压行)

学习了树上莫队,树分块后对讯问的$dfs序$排序,然后就可以滑动树链处理答案了. 关于树链的滑动,只需要特殊处理一下$LCA$就行了. 在这里一条树链保留下来给后面的链来转移的$now$的为这条树链上所有点除去$LCA$的颜色种数.因为如果要考虑$LCA$情况就太多了,不如单独考虑$LCA$. 转移后加上当前链的$LCA$进行统计,然后再去掉这个$LCA$更新一下$now$值给后面的链转移. 这都是我的理解,说的有点不清楚,具体请看vfk的题解 OTZ 虽然不是这道题,但是通过这篇博客学习树上莫

涛哥的Python工具箱之批量删除含指定字符串行

我们在软件研发中不可避免的要用到大量的反复性的繁琐的工作,比如批量改动代码中接口的字符串.批量下载文件并又一次按规则命名.这些工作人工做特别累,尤其是对我这样的懒人来说. 对于一个出色的程序猿来说,反复是最不能接受的事情之中的一个,因此我们要发明工具把反复的工作自己主动化.曾经我是用linux shell脚本来完毕这些事情的,但因为shell脚本语法能力的限制.有些复杂功能无法有效高速的实现,而且写出的代码难以维护,基本属于一次性代码,非常难复用.因此后面慢慢開始尝试用Python完毕一些自己主

printf函数的多行写法

#include <stdio.h> #include <stdlib.h> int main(void) { // Method One printf("Line-1"); printf("Line-1\n"); // Method Two printf("Line-2Line-2\n"); // Method Three printf("Line-3" "Line-3\n");

Filebeat 关键字多行匹配日志采集(multiline与include_lines)

很多同事认为filebeat采集日志不能做到多行处理,今天这里讨论下filebeat的multiline与include_lines. 先来个案例,以下日志,我们只要求采集error的字段, 2017/06/22 11:26:30 [error] 26067#0: *17918 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.32.17, server: localh

Qt - 解析命令行

Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数. 一.命令行写法 命令行:"-abc" 在QCommandLineParser的解析模式为ParseAsCompactedShortOptions(默认)时会被认为是3个参数,即"-a"."-b"和"-c" QCommandLineOption op1("a"); QCommand

Qt:解析命令行

Qt从5.2版開始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行參数. 一.命令行写法 命令行:"-abc" 在QCommandLineParser的解析模式为ParseAsCompactedShortOptions(默认)时会被觉得是3个參数,即"-a"."-b"和"-c" QCommandLineOption op1("a"); QCommand

sed 指定行范围匹配(转)

sed -n '5,10{/pattern/p}' file sed是一个非交互性性文本编辑器,它编辑文件或标准输入 导出的文件拷贝.标准输入可能是来自键盘.文件重定向.字符串或变量,或者是一个管道文件.sed可以随意编辑小或大的文件,有许多sed命令用来编辑. 删除,并允许做这项工作时不在现场.sed一次性处理所有改变,因而变得很有效,对用户来说,最重要的是节 省了时间.sed必须通过行号和正则表达式指定要改变的文本行 sed怎样读取数据:sed从文件的一个文本行或从标准输入的几种格式中读取数

[HNOI2012]集合选数 --- 状压DP

[HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中. 同学们不喜欢这种具有枚举性 质的题目,于是把它变成了以下问题:对于任意一个正整数, 如何求出\({1,2,3...n}\) 的满足上述约束条件的子集的个数(只需输出对 \(10^{9}+1\) 取模的结果),现在这个问题就交给你了. 输入格式: 只有一行,其中有一个正整数 \(n\) 30

P1357 花园 状压 矩阵快速幂

题意 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(2<=N<=10^15).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(2<=M<=5,M<=N)个花圃中有不超过K(1<=K<M)个C形的花圃,其余花圃均为P形的花圃. 例如,N=10,M=5,K=3.则 CCPCPPPPCC 是一种不符合规则的花圃: CCPPPPCPCP 是一种符合规则的花圃. 请帮小L求出符合规则的花园种数Mod 1000000007 由于请