[abc] AtCoder Beginner Contest 207 B数学分析

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<=sumD

范围 : 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+xB<=DxC
A < = x ∗ ( D ∗ C − B ) A<=x*(D*C-B) A<=x(DCB)
x > = A / ( D ∗ C − B ) x>=A/(D*C-B) x>=A/(DCB)

如果是 无解非正数解 那么输出 − 1 -1 1
因为 A > = 1 A>=1 A>=1即需要满足 D ∗ C − B > 0 D*C-B>0 DCB>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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值