题目链接:https://atcoder.jp/contests/arc062/tasks/arc062_a
题目描述:
C - AtCoDeerくんと選挙速報 / AtCoDeer and Election Report
Time Limit: 2 sec / Memory Limit: 256 MB
Score : 300300 points
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 NN times, and when he checked it for the ii-th (1≦i≦N)(
1≦i≦N) time, the ratio was Ti:AiTi: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 NN-th time. It can be assumed that the number of votes obtained
by each candidate never decreases.
Constraints
- 1≦N≦10001≦N≦1000
- 1≦Ti,Ai≦1000(1≦i≦N)1≦Ti,Ai≦1000(1≦i≦N)
- TiTi and AiAi (1≦i≦N)(1≦i≦N) are coprime.
- It is guaranteed that the correct answer is at most 10181018.
Input
The input is given from Standard Input in the following format:
NN T1T1 A1A1 T2T2 A2A2 :: TNTN ANAN
Output
Print the minimum possible total number of votes obtained by Takahashi and Aoki when
AtCoDeer checked the report for the NN-th time.
Sample Input 1 Copy
Copy
3 2 3 1 1 3 2
Sample Output 1 Copy
Copy
10
When the numbers of votes obtained by the two candidates change as 2,3→3,
3→6,42,3→3,3→6,4, the total number of votes at the end is 1010, which is the
minimum possible number.
Sample Input 2 Copy
Copy
4 1 1 1 1 1 5 1 100
Sample Output 2 Copy
Copy
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 Copy
Copy
5 3 10 48 17 31 199 231 23 3 2
Sample Output 3 Copy
Copy
6930
思路:
首先很明显我们要模拟整个过程,但是每次怎么确定第i次操作后的两个数,考虑每次从i-1项到第i项,
即由某一种比例关系通过加值转换为另一种比例关系,即第i项的最终状态是两个值T和A均大于等于第i-1项的T、A
且保持第i项比例关系的最小值,要想保持比例关系,只能乘以1、2、3,,,,,,最小乘以几,可以由该式子得出:
max((a[i-1].first-1)/a[i].first+1,(a[i-1].second-1)/a[i].second+1),即第i项的值除以i-1项向上取整。思路没那么难,
说复杂了,,,
代码实现:
#include<iostream>
#include<string>
#define LL long long
#define INF 0x3f3f3f3f
#define io ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
const int N=2e5+100;
using namespace std;
pair<LL,LL>a[N];
int main()
{
int n;
while(cin>>n)
{
for(int i=1;i<=n;i++)cin>>a[i].first>>a[i].second;
if(a[1].first==a[1].second)a[1].first=a[1].second=1;
for(int i=2;i<=n;i++)
{
LL tmp=max((a[i-1].first-1)/a[i].first+1,(a[i-1].second-1)/a[i].second+1);
a[i].first*=tmp;
a[i].second*=tmp;
}
cout<<a[n].first+a[n].second<<endl;
}
return 0;
}