A. Add and Divide
分析: 暴力枚举 b + x b+x b+x的每个操作次数,只需要枚举 l o g 2 ( 1 0 9 ) = 29 log_2(10^9)=29 log2(109)=29次
代码:
#include<bits/stdc++.h>
using namespace std;
int t,a,b;
int main(){
cin>>t;
while(t--){
int ans=1000;
cin>>a>>b;
int tmp=b;
if(tmp==1) tmp++;
for(int i=tmp;i<tmp+30;i++){
int res=0,ta=a;
while(ta>=i){
ta/=i;
res++;
}
ans=min(res+1+i-b,ans);
}
cout<<ans<<endl;
}
}
B. Replace and Keep Sorted
分析:
结论: 答 案 : k + a [ r ] − a [ l ] − 1 − 2 r + 2 l 答案:k+a[r]-a[l]-1-2r+2l 答案:k+a[r]−a[l]−1−2r+2l
推导:
设左区间为 l l l,右区间为 r r r
对于左区间端点:
a [ l ] − 1 a[l]-1 a[l]−1
对于右区间端点:
k − a [ r ] k-a[r] k−a[r]
其他点 i i i:
( a [ i ] − a [ i − 1 ] − 1 ) + ( a [ i + 1 ] − a [ i ] − 1 ) (a[i]-a[i-1]-1)+(a[i+1]-a[i]-1) (a[i]−a[i−1]−1)+(a[i+1]−a[i]−1)
= a [ i + 1 ] − a [ i − 1 ] − 2 =a[i+1]-a[i-1]-2 =a[i+1]−a[i−1]−2
为什么不用计算左右端点的另一边?因为下一个点/上一个点还会计算差值
累加:
∑ i = l + 1 r − 1 a [ i + 1 ] − a [ i − 1 ] − 2 \sum_{i=l+1}^{r-1}a[i+1]-a[i-1]-2 i=l+1∑r−1a[i+1]−a[i−1]−2
= a [ r ] − a [ l ] − 2 ( r − l − 1 ) =a[r]-a[l]-2(r-l-1) =a[r]−a[l]−2(r−l−1)
加上两个端点的值:
k + a [ r ] − a [ l ] − 1 − 2 r + 2 l k+a[r]-a[l]-1-2r+2l k+a[r]−a[l]−1−2r+2l
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,q,k,a[N],l,r;
int main(){
cin>>n>>q>>k;
for(int i=1;i<=n;i++) cin>>a[i];
while(q--){
cin>>l>>r;
cout<<k+a[r]-a[l]-1-2*r+2*l<<endl;
}
}