結果
問題 |
No.281 門松と魔法(1)
|
ユーザー |
![]() |
提出日時 | 2018-11-15 19:11:19 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 4 ms / 1,000 ms |
コード長 | 1,180 bytes |
コンパイル時間 | 2,015 ms |
コンパイル使用メモリ | 193,076 KB |
最終ジャッジ日時 | 2025-01-06 16:43:20 |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 57 |
ソースコード
#include<bits/stdc++.h> using namespace std; using Int = long long; template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;} template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;} //INSERT ABOVE HERE const Int INF = 1e15; // a < b > c Int solve1(Int a,Int b,Int c,Int d){ if(b<2) return INF; if(d==0) return a<b&&b>c&&a!=c?0:INF; Int res=0; if(a>=b){ Int x=(a-b)/d; a-=x*d;res+=x; if(a>=b) a-=d,res++; } if(c>=b){ Int x=(c-b)/d; c-=x*d;res+=x; if(c>=b) c-=d,res++; } chmax(a,0); chmax(c,0); // a < b > c assert(a<b&&b>c); if(a==0&&c==0) return INF; if(a!=c) return res; return res+1; } // a > b < c Int solve2(Int a,Int b,Int c,Int d){ if(min(a,c)<=0) return INF; if(d==0) return a>b&&b<c&&a!=c?0:INF; Int res=0; if(min(a,c)<=b){ Int x=(b-min(a,c))/d; b-=x*d;res+=x; if(min(a,c)<=b) b-=d,res++; } chmax(b,0); assert(a>b&&b<c); // a > b < c if(a!=c) return res; return solve2(a-d,b,c,d)+res+1; } signed main(){ Int d,a,b,c; cin>>d>>a>>b>>c; Int ans=min(solve1(a,b,c,d),solve2(a,b,c,d)); if(ans>=INF) ans=-1; cout<<ans<<endl; return 0; }