USACO Section 2.1 Ordered Fractions 解题报告
题目
题目描述
给定一个数N(1<=N<=160),需要产生所有的分数,这些分数的值必须要在0~1
之间。而且每个分数的分母不能超过N。如下例所示:
N = 5
产生所有的分数:0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
样例输入
5
样例输出
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
解题思路
这个题目最一开始我走了一些弯路,想得太复杂,结果第一发就超时了。后来静下心来算了想了下,发现枚举加排序速度就已经很快了。所以就实现了一下,通过。
解题代码
/*
ID: yinzong2
PROG: frac1
LANG: C++11
*/
#define MARK
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 170;
int N;
struct Frac {
int num;
int deno;
};
vector<Frac> lst;
bool cmp(Frac A, Frac B) {
int temp1 = A.num*B.deno;
int temp2 = A.deno*B.num;
return temp1 < temp2;
}
int GCD(int x, int y) {
if (0 == y) return x;
return GCD(y, x%y);
}
Frac afterGCD(Frac f) {
int gcd = GCD(f.num, f.deno);
f.num /= gcd;
f.deno /= gcd;
return f;
}
int main() {
#ifdef MARK
freopen("frac1.in", "r", stdin);
freopen("frac1.out", "w", stdout);
#endif // MARK
while (cin >> N) {
cout << "0/1" << endl;
if (N != 1) {
lst.clear();
for (int i = N; i >= 2; --i) {
for (int j = 1; j < i; ++j) {
Frac f;
f.num = j;
f.deno = i;
lst.push_back(f);
}
}
sort(lst.begin(), lst.end(), cmp);
int len = lst.size();
Frac pre;
pre = afterGCD(lst[0]);
cout << pre.num << "/" << pre.deno << endl;
// 对于排序后的数据进行去重
for (int i = 1; i < len; ++i) {
lst[i] = afterGCD(lst[i]);
if (lst[i].num == pre.num && lst[i].deno == pre.deno) continue;
cout << lst[i].num << "/" << lst[i].deno << endl;
pre = lst[i];
}
}
cout << "1/1" << endl;
}
}
/*
Executing...
Test 1: TEST OK [0.000 secs, 4180 KB]
Test 2: TEST OK [0.000 secs, 4180 KB]
Test 3: TEST OK [0.000 secs, 4180 KB]
Test 4: TEST OK [0.014 secs, 4180 KB]
Test 5: TEST OK [0.014 secs, 4180 KB]
Test 6: TEST OK [0.014 secs, 4180 KB]
Test 7: TEST OK [0.028 secs, 4180 KB]
Test 8: TEST OK [0.070 secs, 4180 KB]
Test 9: TEST OK [0.056 secs, 4180 KB]
Test 10: TEST OK [0.056 secs, 4188 KB]
Test 11: TEST OK [0.140 secs, 4188 KB]
All tests OK.
*/
解题思路(type2)
之后看了看官方的题解,发现第一个解法就是用的枚举加排序,但是有个优化的地方我之前没有考虑。我们最终枚举出来的所有的分数,分子分母应该都是互质的。所以我们对于所有分子分母互质的分数进行排序输出即可。
解题代码
/*
ID: yinzong2
PROG: frac1
LANG: C++11
*/
#define MARK
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 170;
int N;
struct Frac {
int num;
int deno;
};
vector<Frac> lst;
bool cmp(Frac A, Frac B) {
int temp1 = A.num*B.deno;
int temp2 = A.deno*B.num;
return temp1 < temp2;
}
int GCD(int x, int y) {
if (0 == y) return x;
return GCD(y, x%y);
}
int main() {
#ifdef MARK
freopen("frac1.in", "r", stdin);
freopen("frac1.out", "w", stdout);
#endif // MARK
while (cin >> N) {
cout << "0/1" << endl;
if (N != 1) {
lst.clear();
for (int i = N; i >= 2; --i) {
for (int j = 1; j < i; ++j) {
Frac f;
f.num = j;
f.deno = i;
if (GCD(f.num, f.deno) != 1) continue;
lst.push_back(f);
}
}
sort(lst.begin(), lst.end(), cmp);
int len = lst.size();
for (int i = 0; i < len; ++i) {
cout << lst[i].num << "/" << lst[i].deno << endl;
}
}
cout << "1/1" << endl;
}
}
/*
Executing...
Test 1: TEST OK [0.000 secs, 4180 KB]
Test 2: TEST OK [0.000 secs, 4180 KB]
Test 3: TEST OK [0.000 secs, 4180 KB]
Test 4: TEST OK [0.000 secs, 4180 KB]
Test 5: TEST OK [0.000 secs, 4180 KB]
Test 6: TEST OK [0.000 secs, 4180 KB]
Test 7: TEST OK [0.000 secs, 4180 KB]
Test 8: TEST OK [0.014 secs, 4180 KB]
Test 9: TEST OK [0.028 secs, 4180 KB]
Test 10: TEST OK [0.056 secs, 4180 KB]
Test 11: TEST OK [0.140 secs, 4188 KB]
All tests OK.
*/
解题思路(type3)
官方第二个解法很巧妙。是找到一个数学规律,直接可以打印所有的数字,时间复杂度为O(N)
。具体可以看这里。
解题代码
/*
ID: yinzong2
PROG: frac1
LANG: C++11
*/
#define MARK
#include <iostream>
#include <cstdio>
using namespace std;
int N;
void generateFrac(int num1, int denom1, int num2, int denom2) {
if (denom1 + denom2 > N) return ;
generateFrac(num1, denom1, num1+num2, denom1+denom2);
cout << num1+num2 << "/" << denom1+denom2 << endl;
generateFrac(num1+num2, denom1+denom2, num2, denom2);
}
int main() {
#ifdef MARK
freopen("frac1.in", "r", stdin);
freopen("frac1.out", "w", stdout);
#endif // MARK
while (cin >> N) {
cout << "0/1" << endl;
generateFrac(0, 1, 1, 1);
cout << "1/1" << endl;
}
return 0;
}
/*
Executing...
Test 1: TEST OK [0.000 secs, 4176 KB]
Test 2: TEST OK [0.000 secs, 4176 KB]
Test 3: TEST OK [0.000 secs, 4176 KB]
Test 4: TEST OK [0.000 secs, 4176 KB]
Test 5: TEST OK [0.000 secs, 4176 KB]
Test 6: TEST OK [0.000 secs, 4176 KB]
Test 7: TEST OK [0.000 secs, 4176 KB]
Test 8: TEST OK [0.014 secs, 4176 KB]
Test 9: TEST OK [0.028 secs, 4176 KB]
Test 10: TEST OK [0.056 secs, 4176 KB]
Test 11: TEST OK [0.140 secs, 4176 KB]
All tests OK.
*/
USACO Section 2.1 Ordered Fractions 解题报告的更多相关文章
- USACO Section2.1 Ordered Fractions 解题报告
frac1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section 1.3 Prime Cryptarithm 解题报告
题目 题目描述 牛式的定义,我们首先需要看下面这个算式结构: * * * x * * ------- * * * <-- partial product 1 * * * <-- parti ...
- USACO Section 1.4 Arithmetic Progressions 解题报告
题目 题目描述 现在给你一个数集,里面的数字都是由p^2+q^2这种形式构成的0 <= p,q <= M,我现在需要你在其中找出一个长为N的等差数列,数列中的第一个数字为a,公差为b,当你 ...
- USACO Section 1.3 Combination Lock 解题报告
题目 题目描述 农夫John的牛从农场逃脱出去了,所以他决定用一个密码锁来把农场的门锁起来,这个密码锁有三个表盘,每个表盘都是环形的,而且上面刻有1~N,现在John设了一个开锁密码,而且这个锁的设计 ...
- USACO Section 1.3 Barn Repair 解题报告
题目 题目描述 某农夫有一个养牛场,所有的牛圈都相邻的排成一排(共有S个牛圈),每个牛圈里面最多只圈养一头牛.有一天狂风卷积着乌云,电闪雷鸣,把牛圈的门给刮走了.幸运的是,有些牛因为放假,所以没在自己 ...
- USACO Section 1.3 Mixing Milk 解题报告
题目 题目描述 Merry Milk Makers 公司的业务是销售牛奶.它从农夫那里收购N单位的牛奶,然后销售出去.现在有M个农夫,每个农夫都存有一定量的牛奶,而且每个农夫都会有自己的定价.假设所有 ...
- USACO Section 1.2 Dual Palindromes 解题报告
题目 题目描述 有一些数(如 21),在十进制时不是回文数,但在其它进制(如二进制时为 10101)时就是回文数. 编一个程序,从文件读入两个十进制数N.S.然后找出前 N 个满足大于 S 且在两种以 ...
- USACO Section 1.2 Palindromic Squares 解题报告
题目 题目描述 输入一个基数B,现在要从1到300之间找出一些符合要求的数字N.如果N的平方转换成B进制数之后是一个回文串,那么N就符合要求.我们将N转换成B进制数输出,然后再将N的平方转换成B进制数 ...
- USACO Section 1.2 Milking Cows 解题报告
题目 题目描述 有3个农夫每天早上五点钟便起床去挤牛奶,现在第一个农夫挤牛奶的时刻为300(五点钟之后的第300个分钟开始),1000的时候结束.第二个农夫从700开始,1200结束.最后一个农夫从1 ...
随机推荐
- NO--19 微信小程序之scroll-view选项卡与跳转(二)
本篇为大家介绍为何我们在最后做交互的时候,并没有使用上一篇讲的选项卡的效果. scroll-view与跳转.gif (如无法查看图片,还请翻看上一篇!) 大家注意看,在我点击跳转后,首先能看到的是 ...
- 007 --MySQL索引底层实现原理
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之一.我们都希望查 ...
- Swing的概述
Swing在Java中是一个包,下面就是它的基本概述:简介: Java为了方便图形界面的实现, 专门设计了类库来满足各种各样的图形元素和用户交互事件, 该类库即为抽象窗口工具箱(Abstract Wi ...
- SharpDevelop 笔记
1. 下载地址: http://jaist.dl.sourceforge.net/project/sharpdevelop/ 2. 使用 VS2012 去掉编译不通过的 Test ,其它可以运行调试. ...
- Java之JSP和Servlet基础知识
JSP基础 JSP起源 JSP,JavaServer Pager的简称.由SUN倡导并联合其它公司创建. JSP是一门脚本语言 JSP可以嵌入到HTML中 JSP拥有Java语言的所有特性 面向对象. ...
- 基于LiFi可见光通信技术的研究及应用转化调查
这个仅是本人的部分调研结果,有同行做可见光研究的可以联系交流,QQ:391349683
- 微信公众号开发笔记1(nodejs开发)
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...
- 20135231 JAVA实验报告三:敏捷开发与XP实践
---恢复内容开始--- JAVA实验报告三:敏捷开发与XP实践 20135231 何佳 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...
- 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结
20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...
- WebGL七点二
与上一节相比这一节相当做了些整合和整理,目的是提高了读写效率和减少代码量,就是做了优化.这里我们只需要在顶点着色器中定义一个用于从js传递参数的变量u_MvcMatrix一看就知道是uniform变量 ...