zoukankan      html  css  js  c++  java
  • AtCoDeerくんと選挙速報 / AtCoDeer and Election Report AtCoder

    Problem Statement

     

    AtCoDeer the deer is seeing a quick report of election results on TV. Two candidates are standing for the election: Takahashi and Aoki. The report shows the ratio of the current numbers of votes the two candidates have obtained, but not the actual numbers of votes. AtCoDeer has checked the report N times, and when he checked it for the i-th (1≦iN) time, the ratio was Ti:Ai. It is known that each candidate had at least one vote when he checked the report for the first time.

    Find the minimum possible total number of votes obtained by the two candidates when he checked the report for the N-th time. It can be assumed that the number of votes obtained by each candidate never decreases.

    Constraints

     

    • 1≦N≦1000
    • 1≦Ti,Ai≦1000(1≦iN)
    • Ti and Ai (1≦iN) are coprime.
    • It is guaranteed that the correct answer is at most 1018.

    Input

     

    The input is given from Standard Input in the following format:

    N
    T1 A1
    T2 A2
    :
    TN AN
    

    Output

     

    Print the minimum possible total number of votes obtained by Takahashi and Aoki when AtCoDeer checked the report for the N-th time.

    Sample Input 1

     

    3
    2 3
    1 1
    3 2
    

    Sample Output 1

     

    10
    

    When the numbers of votes obtained by the two candidates change as 2,3→3,3→6,4, the total number of votes at the end is 10, which is the minimum possible number.

    Sample Input 2

     

    4
    1 1
    1 1
    1 5
    1 100
    

    Sample Output 2

     

    101
    

    It is possible that neither candidate obtained a vote between the moment when he checked the report, and the moment when he checked it for the next time.

    Sample Input 3

     

    5
    3 10
    48 17
    31 199
    231 23
    3 2
    

    Sample Output 3

     

    6930


    题意:给你N组数据,每一组数组代表第i秒时两个人的得分比例(最简比例,即分子分母互质),
    问你总共最小需要多少个人投票可以满足这N组情况。

    思路:例如当前比例分数是1:1,要比例变成3:2,我们最小的总分只需要5个总数,即投票个数就是(不是比例)3:2.
    而如果下一个情况又是1:1,我们想最小总数,只不要再多一个人投第二个人的票,比例就是1:1,而个数是3:3.
    我们可以发现要满足某一个情况的比例,我们最小的总人数是上一个比例对应的a和b对当前比例的a和b的向上取整的值再乘以当前比例。
    多写几个数据就可以知道这层关系。
    还有一个要注意的点是,我们除法向上取整虽然有系统函数ceil,但是容易精度丢失导致答案错误,所以我们自己手写一个ceil函数。
    具体的细节看代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <vector>
    #include <iomanip>
    #define ALL(x) (x).begin(), (x).end()
    #define rt return
    #define dll(x) scanf("%I64d",&x)
    #define xll(x) printf("%I64d
    ",x)
    #define sz(a) int(a.size())
    #define all(a) a.begin(), a.end()
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define pii pair<int,int>
    #define pll pair<long long ,long long>
    #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    #define MS0(X) memset((X), 0, sizeof((X)))
    #define MSC0(X) memset((X), '', sizeof((X)))
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define eps 1e-6
    #define gg(x) getInt(&x)
    #define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
    using namespace std;
    typedef long long ll;
    ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
    ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
    inline void getInt(int* p);
    const int maxn=1000010;
    const int inf=0x3f3f3f3f;
    /*** TEMPLATE CODE * * STARTS HERE ***/
    // HFUU-QerM  
    // 00:09:24
    ll CEIL(ll a,ll b)
    {
        // 返回a/b并向上取整。
        ll res=a/b;
        if(a%b)
        {
            res++;
        }
        return res;
    }
    int main()
    {
        //freopen("D:\common_text\code_stream\in.txt","r",stdin);
        //freopen("D:\common_text\code_stream\out.txt","w",stdout);
        gbtb;
        ll a,b;
        ll n;
        cin>>n;
        cin>>a>>b;
        n--;
        ll x,y;
        repd(i,1,n)
        {
            cin>>x>>y;
            ll num=max(CEIL(a,x),CEIL(b,y));
            a=num*x;
            b=num*y;
        }
        cout<<a+b<<endl;
        
        
        
        return 0;
    }
    
    inline void getInt(int* p) {
        char ch;
        do {
            ch = getchar();
        } while (ch == ' ' || ch == '
    ');
        if (ch == '-') {
            *p = -(getchar() - '0');
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 - ch + '0';
            }
        }
        else {
            *p = ch - '0';
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 + ch - '0';
            }
        }
    }
    
    

    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    [不断更新中]模板
    Noip 2018 游记
    [luogu3067 USACO12OPEN] 平衡的奶牛群
    [luogu4127 AHOI2009] 同类分布 (数位dp)
    [luogu4571 JSOI2009] 瓶子和燃料 (数论)
    [luogu4056 JSOI2009] 火星藏宝图 (贪心 dp)
    [luogu3573 POI2014] RAJ-Rally (拓扑排序 权值线段树)
    常见的狄利克雷卷积(一篇很好的博客上看到的)
    cz_xuyixuan
    [bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/10714341.html
Copyright © 2011-2022 走看看