码迷,mamicode.com
首页 > 其他好文 > 详细

usaco Ordered Fractions

时间:2015-09-02 00:12:06      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

题意是给出一个N,将所有分母小于N的非负分数排序输出。

/*
ID: modengd1
PROG: frac1
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;
bool vis[261][261];//判重,枚举出来之后的分数当中可能存在约分后相等的分数
int gcd(int x,int y)
{
    return y==0?x:gcd(y,x%y);
}
struct fra
{
    //分子和分母
    int num1,num2;
    fra(int a,int b)//构造的同时进行约分
    {
        int c=gcd(a,b);
        num1=a/c;
        num2=b/c;
    }
    bool friend operator <(fra f1,fra f2)
    {
        return f1.num1*f2.num2>f2.num1*f1.num2;//通分比较大小,以为用的优先队列排序所以是大于号
    }
};
int main()
{
    freopen("frac1.in","r",stdin);
    freopen("frac1.out","w",stdout);
    int N;
    priority_queue<fra> Q;
    memset(vis,false,sizeof(vis));
    scanf("%d",&N);
    if(N==0)//压入0
        Q.push(fra(0,0));
    else
        Q.push(fra(0,1));
    for(int j=1;j<=N;j++)//枚举分母
    {
        for(int i=1;i<j;i++)//枚举分子
        {
            fra f=fra(i,j);
            if(vis[f.num1][f.num2])//若枚举出来的约分后已经和前面某个相等,则忽略
                continue;
            vis[f.num1][f.num2]=true;
            Q.push(f);
        }
    }
    if(N!=0)//压入1
        Q.push(fra(1,1));
    while(!Q.empty())//输出
    {
        fra now=Q.top();
        Q.pop();
        cout<<now.num1<<‘/‘<<now.num2<<endl;
    }
    return 0;
}

  

usaco Ordered Fractions

标签:

原文地址:http://www.cnblogs.com/modengdubai/p/4776996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!