瀏覽代碼

AC 2008 1A B

dengxinyi 6 年之前
父節點
當前提交
1843aedfc2
共有 5 個文件被更改,包括 181 次插入4 次删除
  1. 74 3
      2008/1A/B/main.go
  2. 0 0
      2008/1A/B/result-large.out
  3. 100 0
      2008/1A/B/result-small.out
  4. 1 1
      2008/1A/B/test.out
  5. 6 0
      2008/1A/B/utils.go

+ 74 - 3
2008/1A/B/main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"bufio"
+	"container/list"
 	"fmt"
 	"os"
 	"strconv"
@@ -13,9 +14,79 @@ func leastMalted(scanner *bufio.Scanner) [][]int {
 	answer := make([][]int, caseCnt)
 	for i := 0; i < caseCnt; i++ {
 		flavorCnt := ReadInt(scanner)
-		customerCnt := ReadInt(scanner)
-		for j := 0; j < customerCnt; j++ {
-			ReadInts(scanner)
+		custCnt := ReadInt(scanner)
+		custList := list.New()
+		singleList := list.New()
+		ansMap := make(map[int]int)
+		for j := 0; j < custCnt; j++ { // Read all customers => List
+			custInts := ReadInts(scanner)
+			cust := list.New()
+			for k := 1; k < 2*custInts[0]; k += 2 {
+				cust.PushBack(Pair{custInts[k], custInts[k+1]})
+			}
+			if cust.Len() == 1 {
+				singleList.PushBack(cust)
+			} else {
+				custList.PushBack(cust)
+			}
+		}
+		validCase := true
+		for validCase && singleList.Len() != 0 {
+			for curr := singleList.Front(); curr != nil; {
+				cust := curr.Value.(*list.List)
+				p := cust.Front().Value.(Pair)
+				if v, ok := ansMap[p._1]; ok && v != p._2 {
+					// If conflict with ansMap, go to next case
+					validCase = false
+					break
+				}
+				ansMap[p._1] = p._2 // Else, put into ansMap
+				next := curr.Next()
+				singleList.Remove(curr)
+				curr = next
+			}
+			for curr := custList.Front(); validCase && curr != nil; {
+				cust := curr.Value.(*list.List)
+				skipCust := false // If customer is already satisfied, skip
+				for p := cust.Front(); p != nil; {
+					pair := p.Value.(Pair)
+					if v, ok := ansMap[pair._1]; ok {
+						if v != pair._2 {
+							// Next pair
+							next := p.Next()
+							cust.Remove(p)
+							p = next
+							continue
+						}
+						// Satisfied, skip
+						skipCust = true
+						break
+					}
+					p = p.Next()
+				}
+				if skipCust {
+					next := curr.Next()
+					custList.Remove(curr)
+					curr = next
+					continue
+				}
+				if cust.Len() == 1 { // Move to singleList
+					singleList.PushBack(cust)
+					next := curr.Next()
+					custList.Remove(curr)
+					curr = next
+				} else if cust.Len() == 0 { // No candidate, wrong case
+					validCase = false
+				} else { // Next cust
+					curr = curr.Next()
+				}
+			}
+		}
+		if validCase {
+			answer[i] = make([]int, flavorCnt)
+			for k, v := range ansMap {
+				answer[i][k-1] = v
+			}
 		}
 	}
 	return answer

File diff suppressed because it is too large
+ 0 - 0
2008/1A/B/result-large.out


+ 100 - 0
2008/1A/B/result-small.out

@@ -0,0 +1,100 @@
+Case #1: 0 1 0 0
+Case #2: IMPOSSIBLE
+Case #3: 0 0 0 0 0 0 1 0 0
+Case #4: IMPOSSIBLE
+Case #5: 0 0 0 0 0
+Case #6: 1
+Case #7: 0 1 0
+Case #8: 0 0 0 1 1 1
+Case #9: 0 0
+Case #10: 1 0 1 0 0
+Case #11: 0 0
+Case #12: 0 0
+Case #13: IMPOSSIBLE
+Case #14: IMPOSSIBLE
+Case #15: 0 0
+Case #16: 1 0 1 0 1 0 0 1 0
+Case #17: 1 0
+Case #18: 0 0
+Case #19: 0 0 0 0 1 1 0
+Case #20: 0 0 0 0 1 1 0 1 0
+Case #21: 1 0 0
+Case #22: IMPOSSIBLE
+Case #23: IMPOSSIBLE
+Case #24: 0 0 1 1
+Case #25: 0 0 0 0 1 0 0
+Case #26: IMPOSSIBLE
+Case #27: 0 1
+Case #28: IMPOSSIBLE
+Case #29: 0 0
+Case #30: 1 0 0 0 0
+Case #31: 0 0
+Case #32: 0 0 0 0 0 1
+Case #33: 1 0 1 0 1 1 0 1 1 1
+Case #34: 0 0
+Case #35: 0 0 1 0
+Case #36: 1 0
+Case #37: 0 0 1 1 0 0 0 1 0
+Case #38: IMPOSSIBLE
+Case #39: 0 1 1 0 0 0
+Case #40: 0 1 0
+Case #41: 0 0
+Case #42: 0 0 0 1 0
+Case #43: 1 1
+Case #44: 1 1 1 1 1 1 1 1 1 1
+Case #45: 0 1 0 0
+Case #46: IMPOSSIBLE
+Case #47: 0 0
+Case #48: IMPOSSIBLE
+Case #49: 0 0 1
+Case #50: 0 0 1 0 1
+Case #51: 0 0 1
+Case #52: IMPOSSIBLE
+Case #53: IMPOSSIBLE
+Case #54: 0 0 1 0 0 0 0 0 1
+Case #55: 0 1 0 0 1 0 1 0
+Case #56: 1 0 0
+Case #57: 0 1 1 1 1 1 0 1 1
+Case #58: 0 0 1 0 1 0
+Case #59: 0 0 0 1 0 0 0
+Case #60: 1 0
+Case #61: 0 1
+Case #62: 0 1 0 0 0 0
+Case #63: 1 0 0 0
+Case #64: 0 0 0 0 1 0
+Case #65: IMPOSSIBLE
+Case #66: 0 1 0 1 0
+Case #67: 1 1
+Case #68: 0 0
+Case #69: IMPOSSIBLE
+Case #70: 0 0
+Case #71: 1 0 0 1 0 0 0 0
+Case #72: 1 1
+Case #73: 1 0 0 0 0 0 0 0 0
+Case #74: 1 0 0
+Case #75: 0 0
+Case #76: 1 1 0 0 0 0 1 1 1 1
+Case #77: 0 1 0 1 0 0 0 0 0 1
+Case #78: 1 0 0 1
+Case #79: 0 0 1
+Case #80: 0 0 1 0 0 0 0 1
+Case #81: 1 0 0 1 1 1 1
+Case #82: 0
+Case #83: 1 0 0 0
+Case #84: 1 0
+Case #85: IMPOSSIBLE
+Case #86: 0 1
+Case #87: 0 1 0 0 0 0
+Case #88: 0 0 1 0 0 0 0 0 0 0
+Case #89: 0 0
+Case #90: 1 0
+Case #91: 0 1 0 0 0 0 0
+Case #92: 1 1 0 0 0 1 1
+Case #93: 0 0 0 0 1 0 0
+Case #94: 1 0 0 0 0
+Case #95: 0 0 0 0 0 1 1 1 0 1
+Case #96: 0 0 0 1
+Case #97: 1 0 0 0 1
+Case #98: 0 0 0 0 0
+Case #99: 0 0
+Case #100: 0 0 0 0 1

+ 1 - 1
2008/1A/B/test.out

@@ -1,2 +1,2 @@
-Case #1: IMPOSSIBLE
+Case #1: 1 0 0 0 0
 Case #2: IMPOSSIBLE

+ 6 - 0
2008/1A/B/utils.go

@@ -6,6 +6,12 @@ import (
 	"strings"
 )
 
+// Pair ...
+type Pair struct {
+	_1 int
+	_2 int
+}
+
 // ReadInt ...
 func ReadInt(s *bufio.Scanner) int {
 	s.Scan()

Some files were not shown because too many files changed in this diff