P6767 [BalticOI 2020/2012 Day0] Roses(贪心&gcd)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P6767 [BalticOI 2020/2012 Day0] Roses(贪心&gcd)相关的知识,希望对你有一定的参考价值。

P6767 [BalticOI 2020/2012 Day0] Roses(贪心&gcd)

m = l c m ( A , C ) m=lcm(A,C) m=lcm(A,C)

m = A t 1 = C t 2 m=At_1=Ct_2 m=At1=Ct2

花费的钱为: B t 1 , D t 2 Bt_1,Dt_2 Bt1,Dt2

不妨设: B t 1 < D t 2 Bt_1<Dt_2 Bt1<Dt2

所以当较劣的 D D D的个数 t 2 ′ > t 2 t_2'>t_2 t2>t2时,显然用 B t 1 Bt_1 Bt1代替会更优秀。

所以只需要枚举 D D D的个数 t 2 ′ ∈ [ 0 , t 2 ] t_2'\\in[0,t_2] t2[0,t2]即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
ll n,a1,b1,a2,b2,ans,mx;
int main(){
	cin>>n>>a1>>b1>>a2>>b2;
	long double x=b1*1.0/a1,y=b2*1.0/a2;
	if(x>y) swap(a1,a2),swap(b1,b2);
	ans = (n+a1-1)/a1*b1;
	mx = a1 / __gcd(a1,a2);
	for(ll i = mx;~i;i--){
		ll tmp = i * b2;
		if(n-i*a2>=0){
			tmp+=(n-i*a2+a1-1)/a1*b1;
		}
		ans=min(ans,tmp);
	}
	printf("%lld\\n",ans);
	return 0;
}

以上是关于P6767 [BalticOI 2020/2012 Day0] Roses(贪心&gcd)的主要内容,如果未能解决你的问题,请参考以下文章

「BalticOI 2020」小丑

LOJ#2369. 「BalticOI 2008」魔法石

[BalticOI 2014]Three Friends 题解

[BalticOI 2014]Three Friends 题解

BalticOI2003Gem 题解(树形DP)

hdu 7111-Remove