博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.8.15 题解 2018暑假集训之石子问题
阅读量:5261 次
发布时间:2019-06-14

本文共 1303 字,大约阅读时间需要 4 分钟。

先放个题面描述


 

题目描述

WHM摆了N堆石子,他有点累,不想合并这些石子,所以他问了ZYC一个非常简单的问题:从左往右数第k个石子在哪一堆里?现在ZYC把这个问题分享给大家一起开心开心。

输入

输入第一行是一个数N,表示石子堆数。

第二行N个用空格隔开的数ai,表示从左往右第i堆有多少个石子。

第三行是一个数M,表示有M次询问。

第四行M个用空格隔开的数qi,表示WHM希望知道第qi个石子属于哪一堆。

输出

输出共有M行,每一行表示第qi个石子属于哪一堆。

 

样例输入

52 7 3 4 931 25 11

样例输出

153

提示

对于100%的数据,1<=N<=10^6 1<= M <=10^5 1<=ai<=1000。


这个题最开始想的是开一个dp数组存每个石子在哪一堆里

结果发现10^6*1000会超256MB

划重点!!!

于是我们可以换一个方向思考存截止到每一组有几个石子(前缀和思想)

(还记得dp的经典例题分组背包是怎么存的吗)

所以对于每一个石子的编号我们只需要找到相邻的两组可以恰好涵盖这个编号(比如说45号,找到一组37和48,即为48那一组)

但是容易发现这样搜会TLE 所以可以二分~

上代码吧

#include
#include
int n,m,a[1000005],q,qzh[1000005];inline int read()//读入优化{ int x,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0'); return x*f;}inline void write(int x)//输出优化{ int f=0;char ch[20]; if(!x){putchar('0');return;} if(x<0){putchar('-');x=-x;} while(x)ch[++f]=x%10+'0',x/=10; while(f)putchar(ch[f--]); putchar('\n');}int main(){ n=read(); for(int i=1;i<=n;i++) { a[i]=read(); qzh[i]=qzh[i-1]+a[i];//前缀和 } m=read(); for(int i=1;i<=m;i++) { q=read(); int l=1,r=n; while(l
=q)r=mid; if(qzh[mid]

 

转载于:https://www.cnblogs.com/qxds/p/9480129.html

你可能感兴趣的文章
react双组件传值和传参
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
价值观
查看>>
mongodb命令----批量更改文档字段名
查看>>
使用&nbsp;SharedPreferences 分类: Andro...
查看>>
TLA+(待续...)
查看>>
题解: [GXOI/GZOI2019]与或和
查看>>
MacOS copy图标shell脚本
查看>>
国外常见互联网盈利创新模式
查看>>
Oracle-05
查看>>
linux grep 搜索查找
查看>>
Not enough free disk space on disk '/boot'(转载)
查看>>
android 签名
查看>>
android:scaleType属性
查看>>
SuperEPC
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
Js时间处理
查看>>
Java项目xml相关配置
查看>>