前缀和and差分

   题目:有一条高铁共经过n个城市Sim要乘高铁游览这条高铁线路上的m个城市,从q[1]开始一直到q[m],第i段铁路可以在这段铁路的出发点用a[i]元买纸质票,或在线上用c[i]元买一张IT卡,随时可以往里充钱,每次走这段铁路自动扣费b[i]元,问最少花费多少元?

   

 int n,m;
    cin>>n>>m;
    int p[m+1],a[n],b[n],c[n];
    for(int i=1;i<=m;i++){
        cin>>p[i];
    }
    for(int i=1;i<n;i++){
        cin>>a[i]>>b[i]>>c[i];
    }
    int roa[n];
    for(int i=1;i<n;i++){
        roa[i]=0;//roa统计每条路走的次数。
    }
    for(int i=1;i<m;i++){//用前缀和统计每条路走的次数
        if(p[i]<p[i+1]){
            roa[p[i]]++;
            roa[p[i+1]]--;
        }else{
            roa[p[i+1]]++;
            roa[p[i]]--;
        }
    }
    int road[n];
    road[0]=0;
    for(int i=1;i<n;i++){//用road数组存储算出来的前缀和
        road[i]=road[i-1]+roa[i];
    }
   
    int sum=0;
    for(int i=1;i<n;i++){//输出
        if(road[i]*b[i]+c[i]>a[i]*road[i]){
            sum+=road[i]*a[i];
        }else{
            sum+=c[i]+road[i]*b[i];
        }
    }
    cout<<sum;

题目:现有n头牛,最高的牛是第p头,高h厘米。如果两头牛中间的牛都比他们矮,则这两头牛可以相望,现在给出m对可以两两相望的牛,问每头牛最高多高?

差分:
//a1,a2,a3,a4,a5
//1 2 3 4 5
//b1=a1 b2=a2-a1 b3=a3-a2 b4=a4-a3 b5=a5-a4
int n,p,h,m;
cin>>n>>p>>h>>m;
int a[n+1];//a数组用前缀和的方式记录每头牛身高
for(int i=1;i<=n;i++){
    a[i]=0;
}
//两头牛中间的牛身高-1  ->   用前缀和的方法,在相望两牛中左边那头的右边一头的位置-1,相望两牛
//中右边那头的位置+1,中间一段的前缀和就能-1
for(int i=0;i<m;i++){
    int x,y;
    cin>>x>>y;
    a[y]++;
    a[x+1]--;
}
cout<<highest+a[1]<<" ";
for(int i=2;i<=n;i++){算出前缀和并输出
    a[i]=a[i-1]+a[i];
    cout<<h+a[i]<<" ";
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值