AtCoder - 2140 (思维)

题意

https://vjudge.net/problem/AtCoder-2140

每次告诉你新的a:b,计算最后最小的a+b。

思路

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;
}

  

posted @ 2019-11-11 10:17  MCQ1999  阅读(166)  评论(0编辑  收藏  举报