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