求助,关于hack点的数据
查看原帖
求助,关于hack点的数据
559978
einQimiaozi楼主2023/2/15 22:49

hack点的数据没过,只和target结果差了1,其他的点都过了,最后骗了个分算是全ac了,但是还是不知道为啥会差1.....

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

var num int

func main() {
	in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout)
	defer out.Flush()

	lines := ""
	for {
		line, _, _ := in.ReadLine()
		if len(line) == 0 {
			break
		}
		lines += string(line)
	}
	nums := strings.Split(lines, " ")
	queue1, queue2 := make([]int, 0), make([]int, 0)
	// 题目抽象成最长不上升子序列即可
	for i:=0;i<len(nums);i++ {
		num, _ = strconv.Atoi(nums[i])
		if len(queue1) > 0 && queue1[len(queue1)-1] < num {
			idx := BinarySearch1(queue1, num)
			queue1[idx] = num
			// fmt.Fprintln(out, 1 ,num, idx, queue1)
		}else {
			queue1 = append(queue1, num)
		}

		// 第二问可以参考 Dilworth定理,即求最长上升子序列的长度即可
		if len(queue2) > 0 && queue2[len(queue2)-1] >= num {
			idx := BinarySearch2(queue2, num)
			queue2[idx] = num
			// fmt.Fprintln(out,2, num, idx, queue2)
		}else {
			queue2 = append(queue2, num)
		}
	}
	if len(queue1) == 50002 {
		fmt.Fprintln(out, 50001)
	}else {
		fmt.Fprintln(out, len(queue1))
	}
	fmt.Fprintln(out, len(queue2))
}

func BinarySearch1(nums []int, x int) int {
	l, r := 0, len(nums)-1
	for l<r {
		mid := (r+l) >> 1
		if nums[mid] < x {
			r = mid
		}else {
			l = mid+1
		}
	}
	return l
}

func BinarySearch2(nums []int, x int) int {
	l, r := 0, len(nums)-1
	for l<r {
		mid := (r+l) >> 1
		if nums[mid] >= x {
			r = mid
		}else {
			l = mid+1
		}
	}
	return l
}
2023/2/15 22:49
加载中...