【排序】洛谷 P1458 順序的分數 Ordered Fractions
阿新 • • 發佈:2019-01-07
題目描述
輸入一個自然數N,對於一個最簡分數a/b(分子和分母互質的分數),滿足1<=b<=N,0<=a/b<=1,請找出所有滿足條件的分數。
這有一個例子,當N=5時,所有解為:
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
給定一個自然數N,1<=n<=160,請程式設計按分數值遞增的順序輸出所有解。
注:①0和任意自然數的最大公約數就是那個自然數②互質指最大公約數等於1的兩個自然數。
輸入輸出格式
輸入格式:
單獨的一行一個自然數N(1..160)
輸出格式:
每個分數單獨佔一行,按照大小次序排列
輸入輸出樣例
輸入樣例#1:
5
輸出樣例#1:
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
說明
USACO 2.1
翻譯來自NOCOW
程式碼
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=1000+10;
int a[MAXN],number[4],ans[4];
void read(int &x)
{
x=0;
char c=getchar();
while(c<'0'||c>'9' )c=getchar();
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
}
int main()
{
int n;
read(n);
for(int i=1;i<=n;++i)
{
read(a[i]);
number[a[i]]++;
}
for(int i=1;i<=n;++i)
{
if(i<=number[1])
{
if (a[i]==3)ans[3]++;
else if(a[i]==2)ans[2]++;
}
else if(i<=number[2]+number[1]&&i>number[1])
{
if(a[i]==3)ans[3]++;
else if(a[i]==1)ans[1]++;
}
else break;
}
printf("%d",ans[3]+max(ans[1],ans[2]));
return 0;
}