gpt4 book ai didi

python - Golang的TLE(超过时间限制)错误,但使用类似逻辑的Python则没有。但为什么?

转载 作者:行者123 更新时间:2023-12-01 20:26:43 25 4
gpt4 key购买 nike

我为Google Kickstart编写了针对同一简单问题的两种解决方案。它们基本上是相同的解决方案。问题链接是this。我提交了两个解决方案,首先是go,然后是python。但是python解决方案可以正确执行,其中go解决方案具有TLE。我正在共享这两个代码。感谢您提供有关错误的反馈。

Go:

package main

import (
"fmt"
"sort"
)

func main() {
var N int
fmt.Scan(&N)
for i := 1; i <= N; i++ {
var house, budget int
fmt.Scan(&house, &budget)
prices := make([]int, house)
for j := 0; j < house; j++ {
fmt.Scan(&prices[j])
}

sort.Ints(prices)
j := 0
for ; j < house; j++ {
if prices[j] > budget {
break
}
budget -= prices[j]
}
fmt.Printf("Case #%d: %d\n", i , j)
}
}

具有改进的时间复杂度O(n)的更新的go解决方案:
package main

import (
"fmt"
)

func main() {
var N int
fmt.Scan(&N)
for i := 1; i <= N; i++ {
var house, budget int
fmt.Scan(&house, &budget)
prices := make([]int, 1000)
for j, val := 0, 0; j < house; j++ {
fmt.Scan(&val)
prices[val-1]++
}

count := 0
for j := 0; j < 1000; j++ {
if prices[j] == 0 {
continue
}
cost := prices[j] * (j + 1)
if budget >= cost {
budget -= cost
count += prices[j]
} else {
c := budget / (j + 1)
count += c
break
}
}
fmt.Printf("Case #%d: %d\n", i, count)
}
}

Python:
N = int(input())

for i in range(1, N + 1):
house, budget = map(int, input().split())
prices = list(map(int, input().split()))
prices.sort()
j = 0
for price in prices:
if price > budget:
break
budget -= price
j += 1
print("Case #", i, ": ", j, sep='')

最佳答案

速度慢于输入读数。函数 fmt.Scan doesn't use buffered IO。您可以使用explicit buffer Fscan 修复此问题。

in := bufio.NewReader(os.Stdin)
fmt.Fscan(in, &N)

这样,即使算法缓慢的解决方案也能通过测试(是的,它好得多)

package main

import (
"fmt"
"sort"
"bufio"
"os"
)

func main() {
var N int
in := bufio.NewReader(os.Stdin)
fmt.Fscan(in, &N)
for i := 1; i <= N; i++ {
var house, budget int
fmt.Fscan(in, &house, &budget)
prices := make([]int, house)
for j := 0; j < house; j++ {
fmt.Fscan(in, &prices[j])
}

sort.Ints(prices)
j := 0
for ; j < house; j++ {
if prices[j] > budget {
break
}
budget -= prices[j]
}
fmt.Printf("Case #%d: %d\n", i , j)
}
}


如果即使对于某些其他问题来说这还不够快,那么还有另一个问题here,它的解决方案甚至更快。

另一个优化是在每次迭代中都注意到不必要的数组分配。由于已为您提供最大的尺寸,您可以

const maxAllocation = 10000
container := make([]int, maxAllocation)

然后在每次迭代中得到一个 slice

prices := container[0:houses]

并与之合作。这个 official blog post很好地解释了内部原理。

关于python - Golang的TLE(超过时间限制)错误,但使用类似逻辑的Python则没有。但为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61180653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com