-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy path11057.go
61 lines (55 loc) · 1.04 KB
/
11057.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// UVa 11057 - Exact Sum
package main
import (
"fmt"
"os"
"sort"
)
func binarySearch(price int, books []int) bool {
l, r := 0, len(books)-1
for l+1 < r {
mid := (l + r) / 2
if books[mid] == price {
return true
}
if books[mid] > price {
r = mid
} else {
l = mid
}
}
return books[l] == price || books[r] == price
}
func solve(m int, books []int) [2]int {
var pair [2]int
sort.Ints(books)
for i, book := range books {
if book > m/2 || i >= len(books)/2 {
break
}
if binarySearch(m-book, books[i+1:]) {
pair[0], pair[1] = book, m-book
}
}
return pair
}
func main() {
in, _ := os.Open("11057.in")
defer in.Close()
out, _ := os.Create("11057.out")
defer out.Close()
var n, m int
for {
if _, err := fmt.Fscanf(in, "%d", &n); err != nil {
break
}
books := make([]int, n)
for i := range books {
fmt.Fscanf(in, "%d", &books[i])
}
fmt.Fscanf(in, "%d", &m)
fmt.Fscanln(in)
pair := solve(m, books)
fmt.Fprintf(out, "Peter should buy books whose prices are %d and %d.\n\n", pair[0], pair[1])
}
}