結果

問題 No.15 カタログショッピング
ユーザー warashiwarashi
提出日時 2016-05-26 18:56:57
言語 Go
(1.22.1)
結果
WA  
実行時間 -
コード長 1,820 bytes
コンパイル時間 11,406 ms
コンパイル使用メモリ 209,092 KB
実行使用メモリ 5,624 KB
最終ジャッジ日時 2023-08-01 08:32:04
合計ジャッジ時間 11,764 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,380 KB
testcase_01 AC 1 ms
4,380 KB
testcase_02 AC 1 ms
4,380 KB
testcase_03 AC 1 ms
4,380 KB
testcase_04 AC 1 ms
4,380 KB
testcase_05 AC 31 ms
5,620 KB
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

package main

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

type priceAndItem struct {
	p int
	i int32
}
type priceAndItemS []priceAndItem

func (p priceAndItemS) Len() int {
	return len(p)
}
func (p priceAndItemS) Swap(i, j int) {
	p[i], p[j] = p[j], p[i]
}
func (p priceAndItemS) Less(i, j int) bool {
	return p[i].p < p[j].p
}

func conv(l int32) string {
	s := make([]string, 0, 32)
	for i := uint(0); i < 32; i++ {
		if (l & (1 << i)) == 0 {
			continue
		}
		s = append(s, strconv.Itoa(int(i+1)))
	}
	return strings.Join(s, " ")
}

func price(P []int, l int32) int {
	p := 0
	for i := uint(0); i < uint(len(P)); i++ {
		if (l & (1 << i)) == 0 {
			continue
		}
		p += P[i]
	}
	return p
}
func search(S int, fh, lh priceAndItemS) []int32 {
	var res []int32
	for i := range fh {
		j := sort.Search(len(lh), func(j int) bool { return fh[i].p+lh[j].p >= S })

		if len(lh) <= j {
			continue
		}
		if fh[i].p+lh[j].p == S {
			var k int
			for {
				if len(lh) <= j+k || lh[j].p != lh[j+k].p {
					break
				}
				res = append(res, fh[i].i|lh[j+k].i)
				k++
			}
		}
	}
	return res
}

func main() {
	var N, S int
	fmt.Scan(&N, &S)
	P := make([]int, N)
	for i := range P {
		fmt.Scan(&P[i])
	}
	fh := make(priceAndItemS, 0, 1<<uint(N/2))
	for i := int32(0); i < 1<<uint(N/2); i++ {
		fh = append(fh, priceAndItem{
			p: price(P, i),
			i: i,
		})
	}
	var tmp uint
	if N%2 == 0 {
		tmp = uint(N / 2)
	} else {
		tmp = uint(N/2 + 1)
	}

	lh := make(priceAndItemS, 0, 1<<tmp)
	for i := int32(0); i < 1<<tmp; i++ {
		item := i << uint(N/2)
		lh = append(lh, priceAndItem{
			p: price(P, item),
			i: item,
		})
	}
	sort.Sort(fh)
	sort.Sort(lh)

	res := search(S, fh, lh)

	var resS []string
	for _, l := range res {
		resS = append(resS, conv(l))
	}
	sort.Strings(resS)
	for _, s := range resS {
		fmt.Println(s)
	}
}
0