日本编程竞赛中的第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 }

心得

在写代码前写下自己的思路非常有用,这样能让思路更加清晰。

posted @ 2022-06-14 14:56  qiuqiu_liu  阅读(55)  评论(0)    收藏  举报