最近学的基础二分

上周星期六开始写二分,到今天还是毛都不懂,有点烦躁..

第一个题是查找最接近的数 第一次接触二分思想

n个数 查与m最接近的数

给出的数列非降,也就是an+1>=an

从同学那里学了个模板,同学实在是太厉害了,这个模板比我在网上看的一些模板好多了....大神还是大神

include<stdio.h>

int nz(int arr[];int n;int k)
{
   int a=0,b=n-1,c=(a+b)/2;//c=(a+b)/2这个很重要
  while(b-a)>1
{   
    if(*(arr+c)==k)return (c);
    else  if(*(arr+c)>k)a=c;
    else if(*(arr+c)<k)b=c;
    c=(a+b)/2;
}
   return(k-*(arr+a)>k-*(arr+b)?b:c);

}

int main()
{
输入n
输入序列a
查找
输出printf("%d",*( a+ nz(a,n,m)  )       );
return 0;


}

然后直接写的第七题 名字叫和为给定数,前后一共提交了八次,最后一次对的........

这一题里又学了个新的二分,叫快速排序,好像有个叫分治法的思想

刚开始根本没想到要用快排和二分查找,就想着把数排一下就找数对,后来发现超时,上网搜了一下才知道不但冒泡不行,查找也要用二分,于是去学了快排,现在的快排还在记模板的水平,只记得要左基准要右边开始,右基准要左边开始,然后今天碰到一个题目有重复数的用左右基准都会超时就G了.....还没学会随机基准怎么用,贴一下和为给定数的代码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int arr[100005];

int nz(int arr[], int n, int k)//二分查找
{
    int a=0, b=n-1, c=(a+b)/2;
    while (b - a > 1)
    {
        if (*(arr + c) == k)return (c);
        else if (*(arr + c) < k)a = c;
        else b = c;
        c = (a + b) / 2;
    }
    return (k - *(arr + a) > *(arr + b) - k ? b : a);
}

void qs(int a[], int left, int right)//快排
{
    int  i = left, j = right, tmp = *(a + left);
    if (left > right)return;

    while (i != j)
    {
        while (i < j && *(a + j) >= tmp)j--;
        while (i < j && *(a + i) <= tmp)i++;
        if (i < j)
        {
            int t = *(a + j);
            *(a + j) = *(a + i);
            *(a + i) = t;
        }
    }
    *(a + left) = *(a + i);
    *(a + i) = tmp;

    qs(a, left, i - 1);
    qs(a, i + 1, right);

}

int main()
{
	int n, m,i;
	scanf("%d", &n);
	for (int i = 0; i <= n - 1; i++)scanf("%d", arr + i);
	scanf("%d", &m); 
	
    qs(arr, 0, n - 1); 
    for (i = 0; i <= n - 1; i++)
    {
        int tmp = m - *(arr + i); //数列里查tmp这个差值
        if ((tmp == *(arr+nz(arr, n, tmp)))&&(nz(arr,n,tmp)!=i))//这里要避免查到自己,3+3=6这种
        {
            printf("%d %d", *(arr + i), tmp);
                return 0;
        }
    }
    if (i == n)printf("No");
	return 0;
}

没什么可写的了,摆烂吧.....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pig in shirt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值