o0w0o / ARTS

ARTS 鸽友打卡🐦
2 stars 0 forks source link

codeforce #579 #72

Open zwwhdls opened 5 years ago

zwwhdls commented 5 years ago

A 题

题意:一堆有学号的小学生排队玩游戏,只有学号是增序或降序就赢了。。限制是:学号是 1~n 之间,总共 n 个人。 思路:一个 for 循环排呗,先检查是否升序,再检查是否降序。需要注意的是,..., n, 1, ... 算增序;..., 1, n, ... 算升序。

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    input := bufio.NewReader(os.Stdin)
    var testCase int

    _, err := fmt.Fscanf(input, "%d\n", &testCase)
    if err != nil {
    }

    for testCase > 0 {
        testCase--

        var n int
        _, err := fmt.Fscan(input, &n)
        if err != nil {
        }

        var p = make([]int, n)

        for i := 0; i < n; i++ {
            _, err := fmt.Fscan(input, &p[i])
            if err != nil {
            }
        }

        if n == 1 {
            fmt.Println("YES")
            continue
        }
        var rresult = true
        var iresult = true
        for i := 1; i < n; i++ {
            if p[i-1] == n {
                if p[i] != 1 {
                    rresult = false
                    break
                }
                continue
            }
            if p[i] != p[i-1]+1 {
                rresult = false
                break
            }
        }
        for i := 1; i < n; i++ {
            if p[i-1] == 1 {
                if p[i] != n {
                    iresult = false
                    break
                }
                continue
            }
            if p[i] != p[i-1]-1 {
                iresult = false
                break
            }
        }
        if iresult == false && rresult == false {
            fmt.Println("NO")
        } else {
            fmt.Println("YES")
        }

    }

}

B 题

题意:给定 4*n 条边长,求问是否能组成 n 个矩形,且其面积相等。 思路:先找出所有出现过两次的边长,组成一个 2*n 的数组,若一个边长只出现过一次,直接 “NO”;再将这个数组排序,收尾相乘,看乘机是否相等,相等就 “YES”,不相等就 “NO”.

package main

import (
    "bufio"
    "fmt"
    "os"
    "sort"
)

func main() {
    input := bufio.NewReader(os.Stdin)
    var testCase int

    _, err := fmt.Fscan(input, &testCase)
    if err != nil {
    }

    for testCase > 0 {
        testCase--

        var x int
        _, err := fmt.Fscan(input, &x)
        if err != nil {
        }

        var a = make([]int, 4*x)
        var l = make([]int, 0)
        var lMap = make(map[int]int)

        for i := 0; i < 4*x; i++ {
            _, err := fmt.Fscan(input, &a[i])
            if err != nil {
            }
            _, ok := lMap[a[i]]
            if ok {
                lMap[a[i]] ++
            } else {
                lMap[a[i]] = 1
            }
        }

        var result = true
        for k, v := range lMap {
            if v%2 != 0 {
                result = false
                break
            }
            for i := 0; i < v/2; i++ {
                l = append(l, k)
            }
        }

        if result == false {
            fmt.Println("NO")
            continue
        }
        sort.Ints(l)
        r := l[0] * l[2*x-1]
        for i := 1; i < x; i++ {
            if l[i]*l[2*x-i-1] != r {
                result = false
                break
            }
        }

        if result == false {
            fmt.Println("NO")
        } else {
            fmt.Println("YES")
        }
    }

}