i++,++i的困扰

本文通过一个具体的C语言示例程序,详细解释了前缀和后缀递增运算符(++i 和 i++)的工作原理及它们如何影响变量的值。通过分析程序输出,帮助读者理解递增运算符在表达式中的行为差异。

 

main()

{

  int i=5,j=5,p,q;

  p=(i++)+(i++)+(i++);

  q=(++j)+(++j)+(++j);

  Response.Write(i,j,p,q);

}

 

  结果

i=8

j=8

p=5+6+7=18

q=6+7+8=21

 

 

i++  是i先参与运算,再自增1。

++i  是i先自增1,再参与运算。

 

 

基恒最近一直在购买手办送女朋友。因为他想要用最少的价钱买手办送女朋友,所以他每天都记录了手办当天的价格。 他的价格表包括连续N天手办的价格,a_ia i ​ 表示第i天的价格。基恒认为他已经注意到了连续几天的平均价格和下一天的价格之间的联系。 他想要检验他的想法并且被一个很有趣的问题困扰着:“对于一个给定的P,请问在这N天中,有多少个不同的连续子序列的平均价格大于等于P?” 如果两个连续子序列的起始位置或结束位置不同,那么我们就认为它们是不同的连续子序列。 输入格式 第一行:一个整数N,表示序列的长度。(1 ≤ N ≤ 1,000,0001≤N≤1,000,000) 第二行:N个整数,a_ia i ​ 表示第i天手办的价格。(0 ≤ a_i ≤ 1,000,000,0000≤a i ​ ≤1,000,000,000) 第三行:一个整数P。(0 ≤ P ≤ 1,000,000,0000≤P≤1,000,000,000) 输出格式 输出在这N天中,平均价格大于等于P的不同连续子序列的数量。以下是本题的答案,请找出下列代码的问题#include<bits/stdc++.h> using namespace std; long long n,a[1100000],sum[1100000],b[1100000]; long long ans[1100000],ni; long long p; void guibing(int l,int r){ if(l==r){ return ; } long long mid=(l+r)/2; long long cnt=0; guibing(l,mid); guibing(mid+1,r); int i=l,j=mid+1; while(i<=mid&&j<=r){ if(b[i]>b[j]){ //cout<<i<<" "<<j<<":"<<b[i]<<" "<<b[j]<<"\n"; ans[++cnt]=b[j++]; ni+=(mid-i+1); } else{ ans[++cnt]=b[i++]; } } while(i<=mid){ ans[++cnt]=b[i++]; } while(j<=r){ ans[++cnt]=b[j++]; } for(int i=1,j=l;i<=cnt,j<=r;i++,j++){ b[j]=ans[i]; } } int main(){ scanf("%lld",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } scanf("%lld",&p); for(int i=1;i<=n;i++){ sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n;i++){ if(a[i]>=p){ ni--; } } for(int i=1;i<=n;i++){ b[i]=sum[i-1]-p*i; } // cout<<"\n"; guibing(1,n); for(int i=1;i<=n;i++){ //cout<<b[i]<<" "; } cout<<"\n"; long long tot=n*(n-1)/2; // cout<<ni<<" "; printf("%lld",tot-ni); return 0; }
最新发布
10-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值