B.
t
a
g
:
tag :
tag: 数学分析
传送门 :
题意 :
给定
A
,
B
,
C
,
D
A,B,C,D
A,B,C,D,表示一开始有
A
A
A个青色球,对于每次操作你可以加入
B
B
B个青色球和
C
C
C个红色球,询问在第几次操作之后,第一次出现
s
u
m
青
色
<
=
s
u
m
红
色
∗
D
sum_{青色} <= sum_{红色}*D
sum青色<=sum红色∗D
范围 : 1 < = A , B , C , D < = 1 0 5 1<=A,B,C,D <=10^5 1<=A,B,C,D<=105
思路 :
一开始以为这个在
1
e
8
1e8
1e8次操作内是有解的,然后莽了一发,
W
A
WA
WA了。最后回到理性分析
我们假设在第 x x x次的时候满足这个条件
也就是
A
+
x
∗
B
<
=
D
∗
x
∗
C
A+x*B <=D*x*C
A+x∗B<=D∗x∗C
A
<
=
x
∗
(
D
∗
C
−
B
)
A<=x*(D*C-B)
A<=x∗(D∗C−B)
x
>
=
A
/
(
D
∗
C
−
B
)
x>=A/(D*C-B)
x>=A/(D∗C−B)
如果是 无解 和 非正数解 那么输出
−
1
-1
−1
因为
A
>
=
1
A>=1
A>=1即需要满足
D
∗
C
−
B
>
0
D*C-B>0
D∗C−B>0
最后输出的时候判断一下是否上取整即可
Code :
// Problem: B - Hydrate
// Contest: AtCoder - AtCoder Beginner Contest 207
// URL: https://atcoder.jp/contests/abc207/tasks/abc207_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <math.h>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
#define IOS ios::sync_with_stdio(false);
#define CIT cin.tie(0);
#define COT cout.tie(0);
#define ll long long
#define x first
// #de
#define y second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(),x.end()
#define Fup(i,a,b) for(int i=a;i<=b;i++)
#define Fde(i,a,b) for(int i=a;i>=b;i--)
typedef priority_queue<int,vector<int>,greater<int>> Pri_m;
typedef pair<int,int> pii;
typedef vector<int> VI;
map<int,int> mp;
/**
a b c d
5 2 3 2
cy re
5 0
7 3
9 6
**/
void solve(){
int a,b,c,d;cin>>a>>b>>c>>d;
//下限没办法确定
if(c*d - b == 0) {
cout<<-1<<endl;
return;
}
int x = c*d-b;
if(x <= 0){
cout<<-1<<endl;
return;
}else{
double ans = a/x;
if(a%x == 0) cout<<ceil(ans)<<endl;
else cout<<ceil(ans)+1<<endl;
}
// ll t = 0 ;
// ll idx = 0 ;
// int N = 1e8;
// while(N){
// if(a<1ll*t*d){
// cout<<idx<<endl;
// return;
// }
// ++idx;
// a+=b;
// t+=c;
// N --;
// }
// cout<<-1<<endl;
}
int main(){
//int t;cin>>t;while(t--)
solve();
return 0 ;
}