丰收

丰收

http://www.nowcoder.com/questionTerminal/83b419c027fa490aa60669b0e7dc06a3

题目难度:二星
考察点:前缀和、二分

方法1:暴力算法

  1. 分析:
    对于的每个询问x,我们从1到n遍历整个数组,期间计算加和sum,直到在第i堆苹果满足x>=sum的时候,此时x属于第i堆苹果,输出即可。

算法实现:
(0). 输入每堆对应的苹果数,用数组记录一下。
(1). 对于查询的x,从第1堆开始遍历,sum表示前i堆的苹果数之和,如果sum>=x,就输出i(属于第i堆)

  1. 复杂度分析:
    时间复杂度:O(n^2)
    空间复杂度:O(n)

  2. 代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 1e5+5;
    int a[MAXN];
    int main() {
     int n; cin>>n;
     for(int i=0; i<n; i++) cin>>a[i];
     int m; cin>>m;
     while(m--) {
         int x; cin>>x;
         int sum = 0;
         for(int i=0; i<n; i++) {
             sum += a[i];
             if(sum >= x) {
                 cout<<i+1<<endl;
                 break;
             }
         }
     }
     return 0;
    }

方法2:前缀和+二分算法

  1. 分析:
    根据之前的算法我们进行优化,分析一下究竟是什么导致了时间复杂度这么高呢?由于我们在m次询问中多次重复计算了从1-i的加和,那么我们可以想办法用一个前缀和数组预处理一下i-i区间的加和,例如:sum[i]表示区间[1,i]的所有苹果的个数和。然后对于查询x来说,我们只需要从sum数组中找到第一个大于等于x的值的下标,输出下标即可,这个显然就可以用二分来做了。
    tips:a. 因为所有数都是正整数,那么sum数组一定是递增的(即有序的)
    b. 二分可以采用系统自带的lower_bound函数。

算法实现:
(0). 输入每堆对应的苹果数,用sum数组记录一下前缀和。
(1). 对于查询x来说,二分sum数组找到第一个大于等于x的下标,输出即可。
2. 复杂度分析:
时间复杂度:O(m*log(n))
空间复杂度:O(n)

  1. 代码:
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 1e5+5;
    int sum[MAXN];
    int main() {
     int n; cin>>n;
     for(int i=1; i<=n; i++) {
         int x; cin>>x;
         sum[i] = sum[i-1] + x;
     }
     int m; cin>>m;
     while(m--) {
         int x; cin>>x;
         int id = lower_bound(sum+1, sum+n+1, x)-sum;
         cout<<id<<endl;
     }
     return 0;
    }
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 11:55
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 13:35
虽然不怎么光彩,经过这件事,可能我真的要去认同“面试八股文早该淘汰!不会用AI作弊的程序员=新时代文盲!”这句话了
HellowordX:Ai的出现是解放劳动力的,不是用来破坏公平竞争环境的,这样下去,轻则取消所有线上面试,严重了会影响整个行业对所有人产生影响,企业会拉高入职考核各种离谱考核会层出不穷
你找工作的时候用AI吗?
点赞 评论 收藏
分享
牛客83700679...:简历抄别人的,然后再投,有反馈就是简历不行,没反馈就是学历不行,多投多改只要技术不差机会总会有的
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务