通过前缀和来看golang的acm输入输出

2024-04-12 06:28

本文主要是介绍通过前缀和来看golang的acm输入输出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前缀和

在这里插入图片描述

问题引入

package mainimport ("fmt"
)func main() {var n, q, l, r intfmt.Scan(&n, &q)a := make([]int, n)ap := make([]int64, n + 1)ap[0] = 0for i := 0; i < n; i++ {fmt.Scan(&a[i])ap[i + 1] = ap[i] + int64(a[i])}for j := 0; j < q; j++ {fmt.Scan(&l, &r)fmt.Println(ap[r] - ap[l-1])}
}

在这里插入图片描述
在这里插入图片描述
考虑是不是输入太慢了,用Scanner试试

package mainimport ("bufio""fmt""os""strconv""strings"
)func main() {/*fmt.Scan()不会处理换行符,所以后面用sc.Scan()会读取换行符*//*改用fmt.Scanln()读取一行,且会丢弃换行符*/var n, q, l, r int//var s stringfmt.Scan(&n, &q)//fmt.Scanln(s)//values := strings.Split(s, " ")//n, _ = strconv.Atoi(values[0])//q, _ = strconv.Atoi(values[1])ap := make([]int64, n+1)ap[0] = 0sc := bufio.NewScanner(os.Stdin)sc.Scan()sc.Scan()strs := strings.Split(sc.Text(), " ")for i := range strs {val, _ := strconv.Atoi(strs[i])ap[i+1] = ap[i] + int64(val)}for i := 0; i < q; i++ {fmt.Scan(&l, &r)fmt.Println(ap[r] - ap[l-1])}
}// package main// import (
//     "fmt"
// )// func main() {
//     var n, q, l, r int
//     fmt.Scan(&n, &q)
//     a := make([]int, n)
//     ap := make([]int64, n + 1)
//     ap[0] = 0//     for i := 0; i < n; i++ {
//         fmt.Scan(&a[i])
//         ap[i + 1] = ap[i] + int64(a[i])
//     }
//     for j := 0; j < q; j++ {
//         fmt.Scan(&l, &r)
//         fmt.Println(ap[r] - ap[l-1])
//     }
// }

本地goland运行:
在这里插入图片描述

但牛客上运行:
在这里插入图片描述
于是,开始对输入输出好好研究:

package mainimport ("bufio""fmt""os"
)func main() {var (n, q, l, r intin = bufio.NewReader(os.Stdin)out = bufio.NewWriter(os.Stdout))fmt.Fscan(in, &n, &q)a := make([]int, n)ap := make([]int64, n+1)ap[0] = 0for i := 0; i < n; i++ {fmt.Fscan(in, &a[i])ap[i+1] = ap[i] + int64(a[i])}for j := 0; j < q; j++ {fmt.Fscan(in, &l, &r)fmt.Fprintln(out, ap[r] - ap[l - 1])// fmt.Println(ap[r] - ap[l-1])out.Flush()}
}

在这里插入图片描述
那么在此前提下,如果第二行输入不一个个读入,用整行读入呢?
(其实到这,我就有了对自己之前行为的评价:之前代码的各种输入输出用的很混乱,想用哪一套就彻底用哪一套呗,快不快慢不慢的,看着就恶心)

package main// 前缀和很简单,往往输入数据会很变态,所以不能用fmt.Scan()和fmt.Println()
// 有好几种优化的输入输出// 用封装好的bufio.NewReader(os.Stdin)和bufio.NewWriter(os.Stdout)/*
var (n, q, l, r intin         = bufio.NewReader(os.Stdin)out        = bufio.NewWriter(os.Stdout)
)func main() {fmt.Fscan(in, &n, &q)a := make([]int, n)ap := make([]int64, n+1)ap[0] = 0for i := 0; i < n; i++ {fmt.Fscan(in, &a[i])ap[i+1] = ap[i] + int64(a[i])}for j := 0; j < q; j++ {fmt.Fscan(in, &l, &r)fmt.Fprintln(out, ap[r]-ap[l-1])out.Flush()}
}
*/// 用适合于整行读取的组合方法
/*
sc := bufio.NewScanner(os.Stdin)
bs := make([]byte, 20000 * 1024) //设置缓冲区的最大读取
readLine = func() (res string) {sc.Scan() //读一行l := strings.Split(sc.Text(), " ")var res stringfor _, s := range l {res += s}return
}
out = bufio.NewWriter(os.Stdout)scanner.Buffer(bs, len(bs)) //设置缓冲区的最大读取
cur := readLine()
fmt.Fprint(out, cur)
out.Flush()
*/import ("bufio""fmt""os""strconv""strings"
)var (n, p, l, r intsc         = bufio.NewScanner(os.Stdin) //按行扫描器out        = bufio.NewWriter(os.Stdout) //文件输出流(要用fmt.Fprint(out, ...))bs         = make([]byte, 20000*1024)   //设置缓冲区最大读取readLine   = func() (res []int) {       //把读取一行的操作封装成一个匿名函数sc.Scan()                             //扫描器读取一行strs := strings.Split(sc.Text(), " ") //将读取的字符串分割成切片res = make([]int, len(strs))          //这一句不能遗漏,返回值是切片类型,必须要有初始化for i, s := range strs {              //将切片中的每个元素转换为int类型,再存入返回值切片里x, _ := strconv.Atoi(s)res[i] = x}return}
)func main() {sc.Buffer(bs, len(bs))         //设置缓冲区读取最大数量cur1 := readLine()             //读第一行ap := make([]int64, cur1[0]+1) //前缀和数组(切片)cur2 := readLine()             //读第二行for i := range cur2 {ap[i+1] = ap[i] + int64(cur2[i]) //求前缀和}for i := 0; i < cur1[1]-1; i++ { //求要求的区间内的数值和cur := readLine()fmt.Fprintln(out, ap[cur[1]]-ap[cur[0]-1])}//最后一组单独写是为了防止最后多个换行cur := readLine()fmt.Fprint(out, ap[cur[1]]-ap[cur[0]-1])//最后一下给Flush出来out.Flush()
}

这篇关于通过前缀和来看golang的acm输入输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896347

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动