日本编程竞赛中的第3题:X±1
题目
给定一个首项为A,公差为D,项数为N的等差数列,数列中的数均称为“好数”,求X至少要经过多少次“+1”或“-1”的操作才能成为一个好数。
-1018≤X,A≤1018
-106≤D≤106
1≤N≤1012
输入X、A、D、N,输出最少的操作数。
感受
读了一遍,有思路了,可是思路有点乱!拿起纸和笔,动手写一写。
思路
-
当A与X相等 → 输出0
-
当A是最接近X的好数 → 输出A与X的差
-
D是负数,X>A
-
D是正数,X<A
-
-
当A不是最接近X的好数 → 输出最接近X的好数与X的差
-
D是负数,但是X比A小
-
最接近的好数在数列的最后一项
-
最接近的好数不在数列的两端
-
D是正数,但是X比A大
-
最接近的好数在数列的最后一项
-
最接近的好数不在数列的两端
!最近的好数不在数列两端则需把比X小和比X大的两项进行比较才能确定答案!
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long x,a,d,n,ans; 4 int main() 5 { 6 cin>>x>>a>>d>>n; 7 if(x==a) 8 { 9 ans=0; 10 } 11 else if((d<0&&x>a)||(d>0&&x<a)||d==0) 12 { 13 ans=abs(x-a); 14 } 15 else 16 { 17 if(d<0&&x<a) 18 { 19 if(d*(n-1)+a<x) 20 { 21 ans=abs((x-a)%d)<=abs(d>>1)?abs((x-a)%d):abs(d-(x-a)%d); 22 } 23 else 24 { 25 ans=d*(n-1)+a-x; 26 } 27 } 28 else 29 { 30 if(d*(n-1)+a>x) 31 { 32 ans=(x-a)%d<=d>>1?(x-a)%d:d-(x-a)%d; 33 } 34 else 35 { 36 ans=x-(d*(n-1)+a); 37 } 38 } 39 } 40 cout<<ans; 41 return 0; 42 }
心得
在写代码前写下自己的思路非常有用,这样能让思路更加清晰。

浙公网安备 33010602011771号