IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> D23-蓝桥杯-二分 -> 正文阅读

[数据结构与算法]D23-蓝桥杯-二分

新blog新气象,刚才花了两个小时调116的dfs,现在开始做深搜!!!

789

没有想象中的顺利
1、区分找左边界和右边界的函数
x》=a[mid]找的是右边界;
2、区分判断条件后是写l=还是r=
3、r应该对应的是mid-1

n,q = map(int,input().split())
a = list(map(int,input().split()))
def get_r(k):
    l,r=0,n-1
    while l<r:
        mid = l+r+1>>1
        if k>=a[mid]:
            l = mid
        else:
            r =mid-1
    if a[l]==k:
        return l
    else:
        return -1
def get_l(k):
    l,r = 0,n-1
    while l<r:
        mid=l+r>>1
        if k<=a[mid]:
            r = mid
        else:
            l = mid+1
    if a[l]==k:
        return l
    else:
        return -1
for _ in range(q):
    k = int(input())
    r = get_r(k)
    l = get_l(k)
    print(l,r)

790

格式化输出的时候差一个{},已经进步很多了!!

n = float(input())

l,r=-100,100
while r-l>1e-8:
    x = (l+r)/2
    if x**3>n:
        r = x
    else:
        l = x
print("{:.6f}".format(l))
        

730

1、在知道是二分题目的情况下,可以写出来;如果不知道是二分,估计很难联想到。这个的数据范围是10**5
2、while(l<r)而不是>
3、这题自己找出了check条件——我要找的是大于等于E的左边界,找的check条件也是符合E要求的条件。——这里还需要听老师是如何讲解这个check条件的、

N = int(input())
nums = list(map(int,input().split()))
l,r =0,100010
def check(mid):
    for i in range(N):
        if mid>=nums[i]:
            mid+=mid-nums[i]
        else:
            mid -= nums[i]-mid
        if mid<0:
            return False
    return True
while(l<r):
    mid = l+r>>1
    if check(mid):
        r = mid
    else:
        l = mid+1
print(l)

1221

第一版本不太对,以为只要保证最大的被平方的顺序就可以,其实不然。

n = int(input())
ans=[]
while n!=0:
    l,r = 0,n
    while(l<r):
        mid = l+r+1>>1
        if mid**2<=n:
            l = mid
        else:
            r = mid-1
    ans.append(l)
    n = n-l**2
if len(ans)<4:
    ans.extend([0]*(4-len(ans)))
ans.sort()
for i in range(len(ans)):
    print(ans[i],end=' ')
        

好凌乱,先去干饭!!!

现在是2022.4.3的14:00
睡了一个很沉的午觉,在一 场的大四的自我介绍上听到一个不太聪明的小学同学笑着讲自己痛苦学习物理的经历。我的同学们,你们还好吗?好久不联系了~假期一定要补上,说一说我们没有说过的故事,可以吗

好了继续做二分了。

1221思路确实想不出来,一会听一下老师的

1227

更是没有思路了,听一下老师的讲解!

现在15:30了。听完了chap2的习题课,出去走了一圈。现在回来把两道二分的题和4道前缀和的题做一下。


1221

听完课后第一版,忘记用二分优化,超时了

N = 3000
n = int(input())
pre = []
ans = []
# 用空间换时间
for c in range(0,int(n**0.5)+2):
    for d in range(c,int(n**0.5)+2):
       pre.append([c*c+d*d,c,d])
pre.sort()
for a in range(0,int(n**0.5)+2):
    for b in range(0,int(n**0.5)+2):
        t = n-a*a-b*b
        for i in range(len(pre)):
            flag = False
            if pre[i][0]==t:
                flag=True
                ans.extend([pre[i][1],pre[i][2]])
                break
        if flag:   
            ans.extend([a,b])
            break
    if flag:
        break
ans.sort()
for i in ans:
    print(i,end=' ')

优化后,还是超时呀

N = 3000
n = int(input())
pre = []
ans = []
# 用空间换时间
for c in range(0,int(n**0.5)+2):
    for d in range(c,int(n**0.5)+2):
       pre.append([c*c+d*d,c,d])
pre.sort()
for a in range(0,int(n**0.5)+2):
    for b in range(0,int(n**0.5)+2):
        t = n-a*a-b*b
        l,r=0,len(pre)-1
        while l<r:
            mid = l+r>>1
            if pre[mid][0]>=t:
                r= mid
            else:
                l=mid+1
        ans.extend([pre[l][1],pre[l][2],a,b])
        break
    break
    #     for i in range(len(pre)):
    #         flag = False
    #         if pre[i][0]==t:
    #             flag=True
    #             ans.extend([pre[i][1],pre[i][2]])
    #             break
    #     if flag:   
    #         ans.extend([a,b])
    #         break
    # if flag:
    #     break
ans.sort()
for i in ans:
    print(i,end=' ')

可能python就是蠢蠢超时把叭
又找到一个错误:
二分后找到的不一定是等于t的,需要判断一下

N = 3000
n = int(input())
pre = []
ans = []
# 用空间换时间
c=0
while c*c<=n:
    d = c
    while c*c+d*d<=n:
        t = c*c+d*d
        pre.append([t,c,d])
        d += 1
    c += 1
        
pre.sort()
flag = False
for a in range(0,int(n**0.5)+2):
    for b in range(0,int(n**0.5)+2):
        t = n-a*a-b*b
        l,r=0,len(pre)-1
        while l<r:
            mid = l+r>>1
            if pre[mid][0]>=t:
                r= mid
            else:
                l=mid+1
        # 不一定能找到对应的t
        if pre[l][0]==t:
            flag = True
            ans.extend([pre[l][1],pre[l][2],a,b])
            break
    if flag:
        break
ans.sort()
for i in ans:
    print(i,end=' ')

这题还是直接暴力吧
甚至暴力写起来思路也不清晰。

这题怎么做都超时啊
复制别人的代码也超时,我丢

1227

这题还是蛮清楚的,二分写check函数真有意思

n,k = map(int,input().split())
N = 100010
h = [0]*N
w = [0]*N
for i in range(n):
    h[i],w[i] = map(int,input().split())

def check(mid):
    res =0
    for i in range(n):
        res += (h[i]//mid)*(w[i]//mid)
    if res>=k:
        return True
    else:
        return False
        
l,r=0,N
while l<r:
    mid = l+r+1>>1
    if check(mid):
        l = mid
    else:
        r = mid-1
        
print(l)

795

n,m = map(int,input().split())
a = [0] + list(map(int,input().split()))
N = 100010
s = [0]*N
for i in range(1,n+1):
    s[i] = s[i-1]+a[i]
for _ in range(m):
    l,r = map(int,input().split())
    print(s[r]-s[l-1])

796

通过了,但是我感觉在读入方面还可以优化。看了一下别人的,发现自己已经写的很好了,没什么优化的,注意x,y都从1开始。

n,m,q = map(int,input().split())
N = 1010
g = [[0]*N for _ in range(N)]
s = [[0]*N for _ in range(N)]

for i in range(1,n+1):
    g[i][:] = [0] + list(map(int,input().split()))
for i in range(1,1+n):
    for j in range(1,1+m):
        s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1]+g[i][j]

for _ in range(q):
    x1,y1,x2,y2 = map(int,input().split())
    print(s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1])
    

1230

直接求,超时了

n,k = map(int,input().split())
N = 100010
s = [0]*N
for i in range(1,n+1):
    a = int(input())
    s[i] = s[i-1]+a
# 求区间和好求,但是暴力进行一段段筛选的话,会超时
res = 0
for i in range(1,n+1):
    for j in range(i,n+1):
        if (s[j]-s[i-1])%k==0:
            res+=1
print(res)

想不出优化方法

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:36:03  更:2022-04-04 12:37:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:00:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码