哈,啦啦 2023-10-20 20:40 采纳率: 75%
浏览 4
已结题

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

是这样,为了看清楚结果对比,我是直接在题解区吾皇网友的题解的基础上做出的一些修改。 可以AC的代码
题目链接:https://www.luogu.com.cn/problem/P5661
题目描述:

img


#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,但是在后续赋值时我也为此做了相应的调整,可是带来的后果确实只能过掉两个案例,我真挚的希望有人能帮我解答这个问题,我已经想了两三个小时了

  • 写回答

2条回答 默认 最新

  • 哈,啦啦 2023-10-21 09:43
    关注

    哈哈哈哈,问题解决了,好傻的,因为后面要用k来进行判断,而在下面的k会被赋值成j,如果j又是被m赋值的,如果m的初始值是0的话,那下面的!k里面的语句就会被执行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月21日
  • 已采纳回答 10月21日
  • 创建了问题 10月20日