寒假6 go
A
cpp用了set
这里用map[int]bool一样
package main
import (
"fmt"
)
func main() {
a := []int{2, 3, 5, 7, 11, 13}
st := make(map[int]bool)
for i := 0; i < 6; i++ {
for j := i + 1; j < 6; j++ {
for k := j + 1; k < 6; k++ {
st[a[i]*a[j]*a[k]] = true
}
}
}
var l, r int
flag := true
fmt.Scan(&l, &r)
for i := l; i <= r; i++ {
if _, ok := st[i]; ok {
fmt.Println(i)
flag = false
break
}
}
if flag {
fmt.Println(-1)
}
}
B
二分查找最小 更新 idx和location的值 然后swap (有人没更新minn wa了...)
不加快读快写就t.....
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
func main() {
var n int
fmt.Scan(&n)
reader := bufio.NewReader(os.Stdin)
a := make([]int, n)
b := make([]int, n)
for i := 0; i < n; i++ {
a[i] = fastReadInt(reader)
}
for i := 0; i < n; i++ {
b[i] = fastReadInt(reader)
}
sort.Ints(a)
minn := int(^uint(0) >> 1)
var location, idx int
for i := 0; i < n; i++ {
p := sort.Search(len(a), func(j int) bool { return a[j] >= b[i] })
if p == n {
p--
}
if p > 0 && abs(a[p-1]-b[i]) < abs(a[p]-b[i]) {
p--
}
if abs(a[p]-b[i]) < minn {
location = p
idx = i
minn = abs(a[p]-b[i])
}
if minn == 0 {
break
}
}
a[location], a[idx] = a[idx], a[location]
writer := bufio.NewWriter(os.Stdout)
for i := 0; i < n; i++ {
fmt.Fprint(writer, a[i])
if i != n-1 {
fmt.Fprint(writer, " ")
}
}
fmt.Fprintln(writer)
writer.Flush()
}
func fastReadInt(reader *bufio.Reader) int {
num := 0
sign := 1
for {
ch, err := reader.ReadByte()
if err != nil {
break
}
if ch == '-' {
sign = -1
} else if '0' <= ch && ch <= '9' {
num = num*10 + int(ch-'0')
} else if ch == ' ' || ch == '\n' {
break
}
}
return num * sign
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
C
看数据范围
打表造数据....
当然把斐波那契存一下也行,慢不了多少
用map来存n和idx idx对应一个结构体数组来存相应的斐波那契元素
不加快读快写要t....
package main
import (
"bufio"
"fmt"
"os"
)
var fibnacial = []int{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811,
514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296,
433494437, 701408733}
type node struct {
i int
j int
k int
}
func main() {
var q int
fmt.Scan(&q)
mp := make(map[int]int)
cnt := 0
p := make([]node, 45*45*45)
for i := 0; i < 45; i++ {
for j := 0; j < 45; j++ {
for k := 0; k < 45; k++ {
sum := fibnacial[i] + fibnacial[j] + fibnacial[k]
mp[sum] = cnt
p[cnt].i = fibnacial[i]
p[cnt].j = fibnacial[j]
p[cnt].k = fibnacial[k]
cnt++
}
}
}
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
for q > 0 {
n := fastReadInt(reader)
if idx, ok := mp[n]; ok {
fmt.Fprintln(writer, p[idx].i, p[idx].j, p[idx].k)
} else {
fmt.Fprintln(writer, -1)
}
q--
}
writer.Flush()
}
func fastReadInt(reader *bufio.Reader) int {
num := 0
sign := 1
for {
ch, err := reader.ReadByte()
if err != nil {
break
}
if ch == '-' {
sign = -1
} else if '0' <= ch && ch <= '9' {
num = num*10 + int(ch-'0')
} else if ch == ' ' || ch == '\n' {
break
}
}
return num * sign
}
D
模拟
概率
package main
import "fmt"
func main() {
var p float64
fmt.Scan(&p)
fmt.Print( p*p*(1-p)*(1-p) )
}
E
模拟
这个BOx x(max)=1e5没看到 以为是个位数......喜提wa1发
因为输入流的问题
var p,q byte
fmt.Scan(&p,&q)
var op int
fmt.Scan(&op)
读入会失败 索性用快读()
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
var p, q byte
fmt.Fscanf(reader, "%c %c\n", &p, &q)
var op int
fmt.Fscanf(reader, "%d\n", &op)
var s string
fmt.Fscanf(reader, "%s\n", &s)
winCount := op/2 + 1
cntr := 0
cntp := 0
flag := 0
for i := 0; i < len(s); i++ {
if s[i] == 'R' {
cntr++
} else {
cntp++
}
if cntr == winCount {
fmt.Fprintln(writer, "kou!")
fmt.Fprintln(writer, i+1)
flag = 1
break
}
if cntp == winCount {
fmt.Fprintln(writer, "yukari!")
fmt.Fprintln(writer, i+1)
flag = 1
break
}
}
if flag == 0 {
fmt.Fprintln(writer, "to be continued.")
fmt.Fprintln(writer, len(s))
}
writer.Flush()
}
I
推公式发现任意一个子矩阵的和都是一段ai的和乘以一段bi的和
转化为寻找sumsub(ai)*sumsub(bi)的最大值
难绷的是有负数 我把最小的也找了() 直接输出几个中的最大的就过了....
package main
import (
"fmt"
)
func maxsum(p []int) int {
n := len(p)
ans := p[0]
sum := 0
for i := 0; i < n; i++ {
sum = max(sum+p[i], p[i])
ans = max(ans, sum)
}
return ans
}
func minsum(p []int) int {
n := len(p)
ans := p[0]
sum := 0
for i := 0; i < n; i++ {
sum = min(sum+p[i], p[i])
ans = min(ans, sum)
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func main() {
var n, m int
fmt.Scan(&n, &m)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&a[i])
}
b := make([]int, m)
for i := 0; i < m; i++ {
fmt.Scan(&b[i])
}
p1 := maxsum(a)
p2 := minsum(a)
q1 := maxsum(b)
q2 := minsum(b)
fmt.Println(max(max(q1*p1, q1*p2), max(q2*p1, q2*p2)))
}
J
DFS
将未涂色的节点和该红节点构造和为3的倍数即可
package main
import (
"fmt"
)
const N = 1e5 + 10
var n int
var f [N]int
var a [N]int
var s string
var e, E [N][]int
var R []int
func dfs(u, fa int) {
if s[u] == 'W' {
f[u] = f[fa]
}
for _, v := range e[u] {
if v != fa {
dfs(v, u)
}
}
}
func main() {
fmt.Scan(&n, &s)
s = " " + s
for i := 2; i <= n; i++ {
var x int
fmt.Scan(&x)
e[x] = append(e[x], i)
}
for i := 1; i <= n; i++ {
f[i] = i
a[i] = 1
}
dfs(1, 0)
for i := 1; i <= n; i++ {
if f[i] == i {
R = append(R, i)
}
E[f[i]] = append(E[f[i]], i)
}
for _, u := range R {
if len(E[u]) == 1 {
fmt.Println(-1)
return
}
if len(E[u])%2 == 1 {
for i := 0; i < 3; i++ {
a[E[u][i]] = 1
}
for i := 3; i < len(E[u]); i++ {
a[E[u][i]] = (i & 1) + 1
}
} else {
for i := 0; i < len(E[u]); i++ {
a[E[u][i]] = (i & 1) + 1
}
}
}
for i := 1; i <= n; i++ {
fmt.Print(a[i])
}
fmt.Println()
}

浙公网安备 33010602011771号