日本编程竞赛中的第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 @   qiuqiu_liu  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示