Usaco-1.4.2-Arithmetic Progressions
2016-04-15 20:27
246 查看
题目链接:http://train.usaco.org/usacoprob2?a=Jji8iKCcb1X&S=ariprog
题目大意:找给定长度的等差数列,使这个等差数列的每一个元素都满足a=p^2 + q^2.
输入n表示等差数列的长度,m表示p, q的取值范围,输出所有满足条件的等差数列的首项和公差。输出顺序首先是公差从小到大,然后才按照首项排序。
解题思路:首先想到的就是打表,把所有的平方和打表,然后排序。最后只需要以两项差为公差,数列中的数值为首项编历一遍就行了。一开始的思路就是对的,但是实现起来还是有一些问题,参考了nocow中的一个人的代码才过了。主要是对于数组的大小没有一个很好的把握,比如结果数组应该开多大。还有就是写代码的时候,if语句没写好发生了数组越界了。下面是代码:
题目大意:找给定长度的等差数列,使这个等差数列的每一个元素都满足a=p^2 + q^2.
输入n表示等差数列的长度,m表示p, q的取值范围,输出所有满足条件的等差数列的首项和公差。输出顺序首先是公差从小到大,然后才按照首项排序。
解题思路:首先想到的就是打表,把所有的平方和打表,然后排序。最后只需要以两项差为公差,数列中的数值为首项编历一遍就行了。一开始的思路就是对的,但是实现起来还是有一些问题,参考了nocow中的一个人的代码才过了。主要是对于数组的大小没有一个很好的把握,比如结果数组应该开多大。还有就是写代码的时候,if语句没写好发生了数组越界了。下面是代码:
#include <iostream> #include <cstring> #include <fstream> #include <algorithm> using namespace std; ifstream fin("ariprog.in"); ofstream fout("ariprog.out"); bool flag[130000]; //判断一个数是否符合p^2 + q^2 int d[33000]; //符合条件的数值都存在这个数组中 struct ANS{ int start, diff; }ans[30000]; //用于保存最后的答案 int k; void cal_s(int m){ memset(flag, 0, sizeof(flag)); for(int i = 0; i <= m; ++i){ for(int j = i; j <= m; ++j) flag[i * i + j * j] = 1; } k = 0; for(int i = 0; i < 130000; ++i){ if(flag[i]) d[k++] = i; } } int comp(ANS a, ANS b){ if( a.diff != b.diff ) return a.diff < b.diff; else return a.start < b.start; } void PrintAns(int w){ sort(ans, ans + w, comp); for(int i = 0; i < w; ++i) fout << ans[i].start << ' ' << ans[i].diff << endl; } int main(){ int n, m; int diff; fin >> n >> m; cal_s(m); //计算所有满足p^2 + q^2的数 int w = 0; for(int i = 0; i < k; ++i){ for(int j = i + 1; j < k; ++j){ diff = d[j] - d[i]; int tmp = n - 2; //数列已经有d[i]和d[j] int atmp = d[j]; while(tmp){ atmp += diff; if( atmp > m * m * 2 || !flag[atmp] ) //前面的判断没有会越界 break; --tmp; } if(!tmp){ //如果满足条件就保存数列 ans[w].start = d[i]; ans[w].diff = diff; ++w; } } } if(!w) fout << "NONE" << endl; else PrintAns(w); //按要求排序并且输出 fin.close(); fout.close(); return 0; }
相关文章推荐
- 【USACO题库】3.2.6 Sweet Butter香甜的黄油
- js事件的相关收集
- 2. Python语言基本语法
- Light OJ 1296 - Again Stone Game (博弈sg函数递推)
- iOS小技巧 - 获取文字的宽度(iOS6与iOS7的方法不同)
- Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
- win8系统更新后Apache报错
- 搜索算法3之1005
- 工作感悟之Android系统开发入门
- POJ-3278-Catch That Cow
- 用QML做简单图片查看器(主要介绍QML鼠标的一些操作)
- 小译UnityAPI-OnApplicationFocus,OnApplicationPause,OnApplicationQuit
- 利用kettle组件导入excel文件到数据库
- 内部类、异常、断言和Loger日志
- 欢迎使用CSDN-markdown编辑器
- Linux好书、经典书籍推荐
- JAVA Introspector内省用法
- codevs 1098 均分纸牌【贪心】
- Leetcode题解 169. Majority Element
- AngularJS语法详解(续)