日本编程竞赛中的第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 }
心得
在写代码前写下自己的思路非常有用,这样能让思路更加清晰。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构