zoukankan      html  css  js  c++  java
  • USACO Section2.1 Ordered Fractions 解题报告

        frac1解题报告 —— icedream61 博客园(转载请注明出处)
    ------------------------------------------------------------------------------------------------------------------------------------------------
    【题目】
      给你N,对于所有的既约分数i/j(1<=j<=N,0<=i<=j),升序排列输出(重复则只留j最小的)。
    【数据范围】
      1<=N<=160
    【输入样例】
      5
    【输出样例】
      0/1
      1/5
      1/4
      1/3
      2/5
      1/2
      3/5
      2/3
      3/4
      4/5
      1/1
    ------------------------------------------------------------------------------------------------------------------------------------------------
    【分析】
      双向链表,往里一个一个插就好了。每个分母i,分子从0到i,扫一遍当前队列即可完成插入。因此,复杂度不到O(N²)。
    ------------------------------------------------------------------------------------------------------------------------------------------------
    【总结】
      没啥可说的。

    ------------------------------------------------------------------------------------------------------------------------------------------------

    【代码】

     1 /*
     2 ID: icedrea1
     3 PROB: frac1
     4 LANG: C++
     5 */
     6 
     7 #include <iostream>
     8 #include <fstream>
     9 using namespace std;
    10 
    11 struct Node
    12 {
    13     int x,y;
    14     Node *l,*r;
    15     Node() {}
    16     Node(int i,int j):x(i),y(j),l(0),r(0) {}
    17     friend bool operator==(Node p,Node q) { return p.x*q.y==p.y*q.x; }
    18     friend bool operator<(Node p,Node q) { return p.x*q.y<p.y*q.x; }
    19     friend bool operator>(Node p,Node q) { return p.x*q.y>p.y*q.x; }
    20     friend ostream& operator<<(ostream& out,Node p) { return cout<<p.x<<"/"<<p.y; }
    21 }*A,*B;
    22 
    23 int N;
    24 
    25 int main()
    26 {
    27     ifstream in("frac1.in");
    28     ofstream out("frac1.out");
    29 
    30     in>>N;
    31     A=new Node(-1,1); B=new Node(2,1); A->r=B; B->l=A;
    32 
    33     for(int i=1;i<=N;++i) // 分母为i
    34     {
    35         Node *now=A;
    36         for(int j=0;j<=i;++j) // 分子为j
    37         {
    38             Node *p=new Node(j,i);
    39             while(*p>*now) now=now->r;
    40             if(*p==*now) continue; else now=now->l;
    41             p->r=now->r; p->r->l=p; p->l=now; now->r=p;
    42         }
    43         //for(Node *p=A->r;p!=B;p=p->r) cout<<p->x<<"/"<<p->y<<endl; cin.get();
    44     }
    45 
    46     for(Node *p=A->r;p!=B;p=p->r) out<<p->x<<"/"<<p->y<<endl;
    47 
    48     in.close();
    49     out.close();
    50     return 0;
    51 }
  • 相关阅读:
    实现用户信息的增删改-mongoose数据库操作
    gulp使用流程及常用插件
    Js面向对象动态添加标签页,Tab栏切换
    类似淘宝侧边栏jq代码编写
    jQuery选择器
    jQuery-突出显示案例
    隔行变色加高亮显示
    ajax请求到后台
    LOOK OUT THE HOLE!
    应用keyup监测输入框兼容IE处理
  • 原文地址:https://www.cnblogs.com/icedream61/p/4337112.html
Copyright © 2011-2022 走看看