pat甲级1044

记录一下pat刷题历程

注意点

  1. 刚开始写的时候每次都从头开始求和,然后理所当然地超时了,然后翻了一下算法笔记,借鉴了书上把从第1个结点到第n个结点的距离储存到sum数组中的方法
    2.在没有刚好相加等于给定值的情况下,要输出相加最接近给定值的解,所以一定要遍历两遍
    ###代码(渣渣代码)
    #include
    #include
    using namespace std;
    const int maxn=100500;
    int dia[maxn];
    int s[maxn]={0};
    int minNum=500000;
    int bin_search(int l,int r,int x){
    int temp=l;
    while(l<=r){
    int mid=(l+r)/2;
    int num=s[mid]-s[temp-1];
    if(numx){
    return mid;
    }else if(num>x) {
    if(num-x<minNum)
    minNum=num-x;
    r=mid-1;
    }else{
    l=mid+1;
    }
    }
    return -1;
    }
    int bin_search1(int m,int l,int r,int x){
    int temp=l;
    while(l<=r){
    int mid=(l+r)/2;
    int num=s[mid]-s[temp-1];
    if(num-x
    m){
    return mid;
    }else if(num>x+m) {
    r=mid-1;
    }else{
    l=mid+1;
    }
    }
    return -1;
    }
    int main(){

    int N,M;
    int flag=0;//是否有找到刚好的串
    scanf("%d%d",&N,&M);
    for (int i=1;i<=N;i++){
    scanf("%d",&dia[i]);
    s[i]+=s[i-1]+dia[i];
    }
    for (int i=1;i<=N;i++){
    int res=bin_search(i,N,M);
    if(res!=-1){
    printf("%d-%d\n",i,res);
    flag=1;
    }

    }
    if(flag==0){
    for (int i=1;i<=N;i++){
    int res=bin_search1(minNum,i,N,M);
    if(res!=-1){
    printf("%d-%d\n",i,res);
    flag=1;
    }

    }
    }
    return 0;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值