AtCoder - 2140 (思维)
题意
https://vjudge.net/problem/AtCoder-2140
每次告诉你新的a:b,计算最后最小的a+b。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。思路
如
3 2 3 1 1 3 2
先令a=2,b=3,发现新的为1:1,那么用a/1,b/1,发现b/1=3更大,所以要尽可能满足b(票数不能减少),所以就变成a=3,b=3,接着发现3:2,用a/3=1,b/2=1.5,同样b大,但因为票数为整数,所以不能是4.5:3,而是用1.5向上取整计算,所以是6:4。
这题卡精度,要手写向上取整函数才能过。
代码
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll ceils(ll x,ll y)
{
if(x%y==0)
return x/y;
return x/y+1;
}
int main()
{
std::ios::sync_with_stdio(false);
int n;
ll a,b;
cin>>n>>a>>b;
for(int i=1;i<n;i++)
{
ll x,y;
cin>>x>>y;
ll t=max(ceils(a,x),ceils(b,y));
a=x*t,b=y*t;
}
cout<<a+b<<endl;
return 0;
}
更多精彩

