USACO Section1.4 Arithmetic Progressions 解题报告
ariprog解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
找出所有在双平方数集合S中长度为N的等差数列。
双平方数集合S:所有能表示成p²+q²的数的集合,其中0<=p,q<=M。
【数据范围】
3<=N<=25
1<=M<=250
【输入格式】
N
M
【输出格式】
没找到数列,输出“NONE”。
找到数列了,就输出所有数列,每个数列占一行,格式为“a b”,a为首项、b为公差。
输出顺序:先按b升序,再按a升序。
【输入样例】
5
7
【输出样例】
1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
先把S求出来。
然后以其中任何一个数a为首项,任何一个比a大的数b为第二项,便可得到一个等差数列。再数到第N项,若此N项均在集合S中,则此数列合法。
最后将所有数列按照题目要求排序,输出即可。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
第一次提交,卡在了第7个点上,运行时错误。
拿来数据一试,发现本机运行时间1.5s,看来算法需要改进。
把我的ok函数中*改成+,时间变为1s,不大保险,继续改进。(不过继续改进暂时没思路,先交上去看看……)
这次发现自己又粗心了!OJ上并未说我超时,我的代码只被运行了0.003s就停了,就是单纯的运行时错误!
不过本机运行没报错……看了会儿代码找不到越界,先去吃饭~
去吃饭路上想到哪儿错了~果然是有个地方数组下标越界,严谨性还是太差啊!
第二次提交,AC。
原来这题时间限制不是1s啊……2.2s也能过,我多虑了……
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
/*
ID: icedrea1
PROB: ariprog
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; const int maxd = ; int N,M;
bool d[+maxd]; int L;
int num[maxd]; // maxd只是随便写的 int l;
struct Result
{
int a,b;
friend bool operator<(Result const &x,Result const &y) { return x.b<y.b || x.b==y.b && x.a<y.a; }
}A[]; bool ok(int a,int b)
{
//cout<<"a="<<a<<"\tb="<<b<<endl;
for(int i=;i<N;++i)
{
a+=b;
if(a>maxd || !d[a]) return false;
}
return true;
} void qsort(int l,int r) // 注意,这里的l和全局的l并存,不会有错误~
{
if(l>=r) return;
int i=l,j=r;
Result x=A[(l+r)>>];
while()
{
while(A[i]<x) ++i;
while(x<A[j]) --j;
if(i>j) break;
swap(A[i],A[j]);
++i; --j;
}
qsort(l,j); qsort(i,r);
} int main()
{
ifstream in("ariprog.in");
ofstream out("ariprog.out"); in>>N>>M; for(int p=;p<=M;++p)
for(int q=p;q<=M;++q) d[p*p+q*q]=true; for(int i=;i<=maxd;++i)
if(d[i]) num[++L]=i; for(int i=;i<=L;++i)
{
int a=num[i];
for(int j=i+;j<=L;++j)
{
int b=num[j]-a;
if(ok(a,b))
{
++l; A[l].a=a; A[l].b=b;
//cout<<"A=("<<a<<","<<b<<")"<<endl; cin.get();
}
}
} qsort(,l); if(!l) out<<"NONE"<<endl;
else for(int i=;i<=l;++i) out<<A[i].a<<" "<<A[i].b<<endl; in.close();
out.close();
return ;
}
USACO Section1.4 Arithmetic Progressions 解题报告的更多相关文章
- USACO Section1.5 Prime Palindromes 解题报告
pprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.5 Superprime Rib 解题报告
sprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.5 Number Triangles 解题报告
numtri解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.3 Combination Lock 解题报告
combo解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section1.3 Prime Cryptarithm 解题报告
crypt1解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.3 Barn Repair 解题报告
barn1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section1.3 Mixing Milk 解题报告
milk解题报告 —— icedream61 博客园(转载请注明出处)----------------------------------------------------------------- ...
- USACO Section1.2 Palindromic Squares 解题报告
palsquare解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...
- USACO Section1.2 Dual Palindromes 解题报告
dualpal解题报告 —— icedream61 博客园(转载请注明出处)-------------------------------------------------------------- ...
随机推荐
- 双网卡(一外一内)都启用,将内网卡默认网关去除即可正常连接Internet
- 创建React工程:React工程模板
这是本人初学React做的学习笔记;讲的不是很深,只算是简单的进行介绍. 这是一个小系列.都是在同一个模板中搭建的,但是代码是不能正常执行的. >>index.js <!DOCTYP ...
- 寄生组合式继承 js
寄生组合式继承是集寄生式继承和组合继承的优点于一身,是基于类型继承最有效的方式 function object(o){ function F(){}; F.prototype = o; return ...
- PHP获取系统时间不对的解决办法(转载)
原地址:https://blog.csdn.net/u012124764/article/details/51450958 使用PHP获取系统时间,发现时间不对,是因为PHP默认的时区是UTC,应该将 ...
- POJ-2377 Bad Cowtractors---最大生成树
题目链接: https://vjudge.net/problem/POJ-2377 题目大意: 给一个图,求最大生成树权值,如果不连通输出-1 思路: kruskal算法变形,sort按边从大到小排序 ...
- poj 2115 扩展欧几里得
题目链接:http://poj.org/problem?id=2115 题意: 给出一段循环程序,循环体变量初始值为 a,结束不等于 b ,步长为 c,看要循环多少次,其中运算限制在 k位:死循环输出 ...
- 整数N分解,搭积木,离散数学中的母函数,ZOJ(1163)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1163 解题报告: 将整数N分解为:两个及以上的不重复的整数,最流 ...
- 【转】普及一下ARM和X86的区别,鉴于ATOM已经入驻手机,AMD也会…
这里简单来谈一下,ARM和X86之间为什么不太具有可比性的问题.要搞清楚这个问题首先要明白什么是架构,之前也有很多人提到了架构不同,但架构是什么意思?它是一个比较抽象的概念,不太容易用几句话就解释清楚 ...
- VPS 运行 Node.js 的一些经验
VPS 系统选择 各系统安装难易对比 Ubuntu.Debian 较为简单,CentOS 稍麻烦,32位系统比64位更节省内存 DigitalOcean 甚至推出了 Ubuntu + Node.js ...
- 2018年第九届蓝桥杯【C++省赛B组】第二题 明码
汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32个字节就可以存一个汉字 ...