求助,更改了索引后,结果却不一样了

是这样,为了看清楚结果对比,我是直接在洛谷该题的题解区吾皇网友的题解的基础上做出的一些修改。

可以AC的代码:

 
#include<stdio.h>
int opt,n,t,p,ans,top,m=1,yh[100001],sj[100001],k;//m即为可以使用的优惠券的左端点值,top为右端点值
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&opt,&p,&t);
        if(opt==0) {
          yh[++top]=p;
          sj[top]=t;
          ans+=p;
        }
        else{
            k=0;//做标记
            for(int j=m;j<=top;j++){
                if(sj[j] == -1) continue;//如果用过直接跳过,-1代表不能使用
                if(t-sj[j]>45) m=j;//过期
                else if(yh[j]>=p){
                    k=j;//只要有能用的直接用
                    sj[k]=-1;//记录已经使用
                    break;//退出循环
                }
            }
            if(!k) ans+=p; //k未变,代表没有使用优惠卷
        }
    }
    printf("%d",ans);
} 
 
 

不能AC的代码

#include<stdio.h>
int opt,n,t,p,ans,top,m,yh[100001],sj[100001],k;//m即为可以使用的优惠券的左端点值,top为右端点值
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d%d",&opt,&p,&t);
        if(opt==0) {
          yh[top]=p;
          sj[top++]=t;
          ans+=p;
        }
        else{
            k=0;//做标记
            for(int j=m;j<top;j++){
                if(sj[j] == -1) continue;//如果用过直接跳过,-1代表不能使用
                if(t-sj[j]>45) m=j;//过期
                else if(yh[j]>=p){
                    k=j;//只要有能用的直接用
                    sj[k]=-1;//记录已经使用
                    break;//退出循环
                }
            }
            if(!k) ans+=p; //k未变,代表没有使用优惠卷
        }
    }
    printf("%d",ans);
} 
 

事实上,我只是将初始的时候的m改为了0,但是在后续赋值时我也为此做了相应的调整,可是带来的后果确实只能过掉两个案例,我真挚的希望有人能帮我解答这个问题,我已经想了两三个小时了

全部评论
问题已经解决了,是一个很傻的点,因为后面的k会被赋值成j,而j有来自于m,如果m初始值是0,那么j=0时,k会为0,此时!k中的语句将会执行。
点赞 回复 分享
发布于 2023-10-21 09:48 湖南

相关推荐

淬月星辉:专利是什么?至少描述一下吧,然后把什么计算机二级、普通话这种拉低格调的证书删掉,不然hr以为你没东西写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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