题解 | #丰收#

丰收

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

每个苹果编号1到n;
第二堆苹果的虚拟总数量是前面的和;
    for(int i=1;i<=n;i++){
        scanf("%d",&sz[i]);
        sz[i]+=sz[i-1];
    }

对原输入数组做一个累加处理。

---------------------------------------------------------------------------------------------
2 7 3 4 9  
累加后
2 9 12 16 25
----------------------------------------------------------------------------------------------
这个数组是第一个递增数组
用二分法解决
--------------------------------------------------------------------------------------------
#include<stdio.h>
int main()
{
     int n,m;
    scanf("%d",&n);
    int sz[n+1];
    sz[0]=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&sz[i]);
        sz[i]+=sz[i-1];
    }//输入n堆苹果
        scanf("%d",&m);
    int szsz[m];
     for(int i=0;i<m;i++){
     scanf("%d",&szsz[i]);
    }//输入想知道那一个苹果
   
   
    for(int i=0;i<m;i++){
        int right=0,left=n,tmp=szsz[i];
        if(tmp>sz[n]){printf("%d\n",-1);break;}
        while(right<left-1){//下标折半后没有+-1,所以这里的right最后比left小1
             if(tmp==sz[(left+right)/2]){left=(left+right)/2;break;}
            else if(tmp>sz[(left+right)/2]){right=(left+right)/2;}
            else if(tmp<sz[(left+right)/2]){left=(left+right)/2;}
        }
        printf("%d\n",left);
       
    }
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务