您的位置:首页 > 其它

usaco 2.1.2 frac1

2012-07-20 11:12 381 查看
呃 貌似这道题有很好的方法,不过我已经用笨方法一次过了,就没有再多研究了。我的方法就是枚举加排列,用结构体存分子分母和值,遇到可以约分的略过……下面贴出代码,以作纪念。

View Code

/*{
ID:jzy3209981
PROG:frac1
LANG:C++
}*/
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;

struct fraction
{
int son;
int mum;
double result;
};
int com(int a,int b)
{
int e;
while(a%b!=0)
{
e=b;
b=a%b;
a=e;
}
return b;
}
void paixu(fraction  *first,int a,int b)
{
int i,j;
i=a;j=b;
fraction cha=first[a];
if(i>=j)
return;
while(i<j)
{
while(first[j].result>=first[i].result&&i<j)
j--;
if(i<j)
{
first[i]=first[j];
first[j]=cha;
i++;
}
while(first[i].result<=first[j].result&&i<j)
i++;
if(i<j)
{
first[j]=first[i];
first[i]=cha;
j--;
}
}
paixu(first,a,i-1);
paixu(first,i+1,b);
}

int main()
{
freopen ("frac1.in","r",stdin);
freopen ("frac1.out","w",stdout);
int n,i,j,common,num=0;
fraction *all;
scanf("%d",&n);
all=new fraction[n*n+2*n+1];
for(i=2;i<=n;i++)
for(j=1;j<i;j++)
{
if(j>1)
{
common=com(j,i);
if(common!=1)
continue;
}
all[num].son=j;
all[num].mum=i;
all[num].result=(double)j/i;
num++;
}
paixu(all,0,num-1);
printf("0/1\n");
for(i=0;i<num;i++)
printf("%d/%d\n",all[i].son,all[i].mum);
printf("1/1\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: