第一行输入一个正偶数
代表数字个数。
第二行输入
个正整数
代表给定的数字。
输出一个整数,代表最多可以挑选出的“素数伴侣”的数量。
4 2 5 6 13
2
在这个样例中,
和
可以组成一对素数伴侣,
和
也可以组成一对素数伴侣。因此,最多可以挑选出
对素数伴侣。
4 1 2 2 2
1
在这个样例中,
只能使用一次,与任意一个
组合均是“素数伴侣”。
2 3 6
0
package main import ( "fmt" ) func isPrime(n int) bool { if n < 2 { return false } for i := 2; i*i <= n; i++ { if n%i == 0 { return false } } return true } func getMax(nums []int) int { res := 0 // 按奇偶划分 odds := []int{} evens := []int{} for i := 0; i < len(nums); i++ { if nums[i]&1 == 1 { odds = append(odds, nums[i]) } else { evens = append(evens, nums[i]) } } n := len(evens) // 为每个奇数寻找匹配的偶数 // 采用的策略:先到先得, 能让则让 // 先到先得:如果该偶数的匹配为0,就直接与之匹配 // 能让则让:如果该偶数已经匹配(匹配不为零),那么为与之匹配的奇数重新寻找匹配,如果能找到新的匹配,那么就把该偶数让给当前奇数 // 否则该奇数不能找到匹配 visited := make([]bool, n) //记录第i个偶数在本轮匹配中是否被访问过 matched := make([]int, n) //记录与第i个偶数匹配的奇数 var match func(int) bool //检查该奇数是否能找到合适的匹配, 注意:这是一个闭包函数 match = func(odd int) bool { for i := 0; i < n; i++ { if isPrime(odd+evens[i]) && !visited[i] { visited[i] = true if matched[i] == 0 || match(matched[i]) { matched[i] = odd return true } } } return false } // 为每个奇数寻找匹配 // 每轮的 visited 要清空 for _, odd := range odds { visited = make([]bool, n) if match(odd) { res++ } } return res } func main() { var n int fmt.Scanf("%d", &n) nums := make([]int, n) for i := 0; i < n; i++ { fmt.Scanf("%d", &nums[i]) } fmt.Println(getMax(nums)) }
GO语言实现 匈牙利算法 package main import "fmt" import "io" import "math" func main(){ for { var n int var num int var odds []int var evens []int c, err := fmt.Scanf("%d\n", &n) if c==0 || err==io.EOF{ break } for i:=0; i<n; i++{ fmt.Scanf("%d", &num) if num % 2 == 0{ evens = append(evens, num) }else{ odds = append(odds, num) } } var suited map[int]int = make(map[int]int) var K int for i:=0; i<len(odds); i++{ var visited map[int]int = make(map[int]int) ok := match(odds[i], evens, visited, suited) if ok { K++ } } fmt.Println(K) } } func match(odd int, evens []int, visited map[int]int, suited map[int]int) bool { for _, even := range evens{ if isPrime(odd + even) && visited[even] == 0 { visited[even] = 1 if suited[even] == 0 || match(suited[even], evens, visited, suited) { suited[even] = odd return true } } } return false } func isPrime(num int) bool { n := math.Sqrt(float64(num)) n2 := int(n + 0.5) for i := 2; i <= n2; i++{ if num%i == 0{ return false } } return true }