跳至主要内容

简单的整数相减题目的解法

给定 n 个整数,每次可以进行如下操作:选择其中最大的整数 a 与最小的整数 b,并将它们都替换为 (a−b)。

是否可以在有限次操作内使得所有整数都相等?如果是,最后的结果是什么?

有多组测试数据。第一行输入一个整数 T(约 20)代表测试数据组数。对于每组测试数据:

第一行输入一个整数 n(2≤n≤10)代表给定整数的数量。

第二行输入 n 个整数 a​1​​,a​2​​,⋯,a​n​​(−10​5​​≤a​i​​≤10​5​​)代表给定的整数。

每组数据输出一行。若可以将所有整数变为相等,输出最终产生的那个整数;否则输出 "Impossible"(不输出引号)。
Sample Input / 样例输入

2
3
1 2 3
2
5 5


Sample Output / 样例输出

2
5













package main

import (
        "bufio"
        "container/heap"
        "fmt"
        "os"
        "strconv"
        "strings"
)

// An IntHeap is a min-heap of ints.
type MinIntHeap []*Item

func (h MinIntHeap) Len() int           { return len(h) }
func (h MinIntHeap) Less(i, j int) bool { return h[i].value < h[j].value }
func (h MinIntHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i]; h[i].IndexMin, h[j].IndexMin = i, j }

func (h *MinIntHeap) Push(x interface{}) {
        // Push and Pop use pointer receivers because they modify the slice's length,
        // not just its contents.
        item := x.(*Item)
        item.IndexMin = len(*h)
        *h = append(*h, item)
}

func (h *MinIntHeap) Pop() interface{} {
        old := *h
        n := len(old)
        x := old[n-1]
        *h = old[0 : n-1]
        return x
}

type Item struct {
        value    int
        IndexMax int
        IndexMin int
}

// An IntHeap is a min-heap of ints.
type MaxIntHeap []*Item

func (h MaxIntHeap) Len() int           { return len(h) }
func (h MaxIntHeap) Less(i, j int) bool { return h[i].value > h[j].value }
func (h MaxIntHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i]; h[i].IndexMax, h[j].IndexMax = i, j }

func (h *MaxIntHeap) Push(x interface{}) {
        // Push and Pop use pointer receivers because they modify the slice's length,
        // not just its contents.
        item := x.(*Item)
        item.IndexMax = len(*h)
        *h = append(*h, item)
}

func (h *MaxIntHeap) Pop() interface{} {
        old := *h
        n := len(old)
        x := old[n-1]
        *h = old[0 : n-1]
        return x
}

// This example inserts several ints into an IntHeap, checks the minimum,
// and removes them in order of priority.
func main() {
        reader := bufio.NewReader(os.Stdin)
        text, _ := reader.ReadString('\n')
        text = strings.TrimSpace(text)
        num, _ := strconv.Atoi(text)

        for i := 0; i < num; i++ {
                reader.ReadString('\n')
                str, _ := reader.ReadString('\n')
                str = strings.TrimSpace(str)

                hmin := &MinIntHeap{}
                heap.Init(hmin)

                hmax := &MaxIntHeap{}
                heap.Init(hmax)

                for _, s := range strings.Split(str, " ") {
                        n, _ := strconv.Atoi(s)
                        item := &Item{}
                        item.value = n
                        heap.Push(hmin, item)
                        heap.Push(hmax, item)
                }

                for {
                        max := heap.Pop(hmax).(*Item)
                        min := heap.Pop(hmin).(*Item)
                        if max.value == min.value {
                                fmt.Println(strconv.Itoa(min.value))
                                break
                        }
                        newvalue := max.value - min.value
                        max.value = newvalue
                        min.value = newvalue
                        heap.Push(hmax, max)
                        heap.Fix(hmax, min.IndexMax)
                        heap.Fix(hmin, max.IndexMin)
                        heap.Push(hmin, min)
                }
        }
}

评论

此博客中的热门博文

ncurses与readline结合

  #define _XOPEN_SOURCE 700       /* for wcswidth and 700 is for mbsnrtowcs */ #include<wchar.h> #include<ncurses.h>       /* ncurses.h includes stdio.h */ #include<stdlib.h> #include<string.h> #include<readline/readline.h> #include<locale.h>     int mygetstr( char *str, int y, int x){    WINDOW *win;    int size, col;    int ok = 0;    int width;    wchar_t wstr[80];    char *p;        getmaxyx(stdscr, size, col);        void getaline( char *s){      str = s;      rl_callback_handler_remove();      ok = 1;    }        rl_callback_handler_install( "" , getaline);    win = newwin(1, col-x, y, x);    while (1){      rl_callback_read_char(); ...

简单的整数最小乘积的解法

给定 n 个整数,每次可以从剩下的整数中取走两个整数并计算这两个整数的积。 若该操作进行 m 次,求每次计算的积之和的最小值。 Input / 输入格式 有多组测试数据。第一行输入一个整数 T(约 30)代表测试数据组数,对于每组数据: 第一行输入两个整数 n 和 m(1≤n≤10​5​​, 0≤m≤​2​​n​​),它们的含义如题中所述。 第二行输入 n 个整数 a​1​​,a​2​​,⋯,a​n​​(0≤a​i​​≤10​4​​)表示给定的整数。 Output / 输出格式 每组数据输出一行一个整数,表示积之和的最小值。 Sample Input / 样例输入 3 4 2 1 3 2 4 3 1 2 3 1 4 0 1 3 2 4 Sample Output / 样例输出 10 2 0   Hint / 样例说明 对于第一组样例数据,答案是 1×4+3×2=10。 对于第二组样例数据,答案是 2×1=2。 package main import (         "bufio"         "fmt"         "os"         "sort"         "strconv"         "strings" ) var ...

利用yellowdns解决dns污染问题

 很多网站的dns直接被污染成了127.0.0.1,这样一般就无法访问了,很多翻墙软件也认为是局域网,所以访问不了 这时候,使用yellowdns,将dns转发到远程。然后listen本地的53端口。再将dns服务器都改成本地 vi /etc/resolv.conf windows和路由器,也可以都更改