通过前缀和来看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()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/610386.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity构建详解(7)——AssetBundle格式解析

【文件格式】 文件可以分为文本文件、图片文件、音频文件、视频文件等等&#xff0c;我们常见的这些文件都有行业内的标准格式&#xff0c;其意味着按照一定的规则和规范去保存读取文件&#xff0c;可以获取我们想要的数据。 有些软件会有自己的文件格式&#xff0c;会按照其…

OpenLayers6实战,OpenLayers实现鼠标拖拽方式绘制平行四边形

专栏目录: OpenLayers实战进阶专栏目录 前言 本章介绍如何使用OpenLayers在地图上使用实现鼠标拖拽方式绘制平行四边形。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使用Yarn安装依赖yarn add olvue中如何使用: vue项目…

2.ideal和写代码时常用的快捷键

1.Intelij IDEA左边的工具栏不见了&#xff1a;alt1 2.fnf12->浏览器前端 其中有一个可以搜索路径ctrlF ctrlshiftdelete清除前端代码 3.ctrl/->单行注释 ctrlshift/->多行注释 4.ideal中可以搜索源码的快捷键ctrlN ctrlr在代码中搜索关键字

C--函数指针与回调函数

文章目录 定义函数指针qsort中的回调函数自实现排序的回调函数 定义 回调函数&#xff0c;当一个函数执行时&#xff0c;中途调用其他定义好的函数来帮助实现功能&#xff0c;再继续执行这个函数 函数指针 类型为函数的指针&#xff0c;如下 void func() { } int main() {…

C++类和对象(二)——实例化、对象模型、this指针

1. 类的实例化 用类类型创建对象的过程&#xff0c;称为类的实例化 类是对对象进行描述的&#xff0c;是一个模型一样的东西&#xff0c;限定了类有哪些成员&#xff0c;定义出一个类并没有分配实际的内存空间来存储它&#xff1b;比如&#xff1a;入学时填写的学生信息表&am…

“桃花庵主”是我国哪位古代名人的称号?2024年4月12日蚂蚁庄园今日答案

原文来源&#xff1a;蚂蚁庄园今日答案 - 词令 蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&…

AI论文速读 | 线性时间序列预测模型分析

论文标题&#xff1a;An Analysis of Linear Time Series Forecasting Models 作者&#xff1a; William Toner&#xff0c; Luke Darlow 机构&#xff1a;爱丁堡大学&#xff08;Edinburgh&#xff09;&#xff0c;华为研究中心&#xff08;爱丁堡&#xff09; 论文链接&am…

NotePad++ 快速生成SQL IN (‘’,‘’)

sql In(‘’&#xff0c;‘’)这种形式 第一步&#xff1a;AltC 鼠标放在第一行最左边 第二步 CtrlH $代表行末 第三步 去掉每行换行符 换行可能是"\n" 或者"\r"或者"\r\n" 结果&#xff1a;

【C++算法】线性DP详解:数字三角形、最长上升子序列、最长公共子序列、最长公共子串、字符串编辑距离

文章目录 1&#xff09;数字三角形1&#xff1a;顺推2&#xff1a;逆推 2&#xff09;最长上升子序列1&#xff1a;线性DP做法2&#xff1a;二分优化 3&#xff09;最长公共子序列4&#xff09;最长公共子串5&#xff09;字符串编辑距离 1&#xff09;数字三角形 1&#xff1a…

5G智慧水利数字孪生可视化平台,推进水利行业数字化转型

5G智慧水利数字孪生可视化平台&#xff0c;推进水利行业数字化转型。随着5G技术的快速发展&#xff0c;越来越多的行业开始探索数字化转型的道路。水利行业作为国民经济的重要支柱&#xff0c;也面临着数字化转型的迫切需求。5G智慧水利数字孪生可视化平台作为水利行业数字化转…

品牌软文怎么写?媒介盒子分享

品牌软文是品牌传播的主要方式。高质量的品牌软文能够帮助企业塑造正面的品牌形象&#xff0c;提高品牌知名度和影响力&#xff0c;扩大目标消费者范围。接下来媒介盒子就和大家聊聊&#xff1a;如何写好品牌软文。 一、 确立品牌独特点 品牌独特性是品牌能够与行业内其他品牌…

【电子通识】普通电阻、敏感电阻、可调电阻的种类和特点

电阻的作用 在【分立元件】理解电阻 中我们知道电阻是在电路中对电流产生阻碍作用的元件。电阻是电子产品中最基本、最常用的电子元件之一。 有各产品的电路板中基本都有电阻器&#xff0c;通常起限流、滤波或分压等作用。实际上&#xff0c;电阻器的种类很多&#xff0c;根据其…