「IXOI R1」出题人完全不会给题目起名字 题解
P15444 「IXOI R1」出题人完全不会给题目起名字
题目背景

这是空银子,她非常可爱。
现在她给了你一道题,如果你能做出来,就可以和你约会。
这正是你一直想要的,而这道题肯定难不到你啦。
题目描述
给定一个长度为 n n n 的正有理数序列 a i ( i ∈ [ 1 , n ] ) a_i(i\in[1,n]) ai(i∈[1,n]),定义一次操作为:
选取一个下标 j j j,然后 ∀ i ∈ [ 1 , n ] \forall i\in[1,n] ∀i∈[1,n],令 a i ← a i a j a_i\gets \frac{a_i}{a_j} ai←ajai。
现在空银子想问你,在经过任意次操作之后,序列中的最小值最小能是多少。
输入格式
第一行一个正整数 n n n,表示序列长度。
接下来 n n n 行,第 i + 1 i+1 i+1 行两个正整数 x i , y i x_i,y_i xi,yi,表示 a i = x i y i a_i=\frac{x_i}{y_i} ai=yixi。
输出格式
输出一行两个正整数 x , y x,y x,y,表示最小值是 x y \frac{x}{y} yx。
请注意,你输出的分数必须要是最简分数,特别的,若最终结果化简后是一个整数,则输出的 y y y 为 1 1 1。
输入输出样例 #1
输入 #1
5
4 3
22 8
3 99
4 3
17 43
输出 #1
4 363
说明/提示
样例解释
一共进行 4 4 4 次操作,分别选取下标为 5 , 4 , 1 , 2 5,4,1,2 5,4,1,2,可以得到序列中最小值 4 363 \frac{4}{363} 3634,可以证明不存在更小的答案。
数据范围
本题采用捆绑测试。
| 子任务编号 | n ≤ n\le n≤ | 分值 |
|---|---|---|
| 0 0 0 | 10 10 10 | 20 20 20 |
| 1 1 1 | 5000 5000 5000 | 20 20 20 |
| 2 2 2 | 10 6 10^6 106 | 60 60 60 |
对于所有数据,保证:
2 ≤ n ≤ 10 6 2\le n\le 10^6 2≤n≤106, ∀ i ∈ [ 1 , n ] , 0 < x i , y i ≤ 10 9 \forall i\in[1,n],0<x_i,y_i\le 10^9 ∀i∈[1,n],0<xi,yi≤109。
思路
直接写即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,uv=0,xx=1,yy=1;
struct one{
long long x,y;
}a[1000006];
bool cmp(one a1,one b1){
return a1.x*b1.y<b1.x*a1.y;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
uv=__gcd(a[i].x,a[i].y);
a[i].x/=uv;
a[i].y/=uv;
}
sort(a+1,a+n+1,cmp);
xx=a[1].x*a[n].y;
yy=a[1].y*a[n].x;
uv=__gcd(xx,yy);
xx/=uv;
yy/=uv;
cout<<xx<<" "<<yy<<endl;
return 0;
}

浙公网安备 33010602011771号