心路历程和代码更改尽在注释中
因为正好在学STL,所以故意用容器来写的。但是因为不熟所以光写代码就挺久了。
问题描述:
- 第一个问题:问题如何拆分。
- 第二个问题:选择什么容器完成。
- 第三个问题:如何使用容器(bushi
- 第四个问题:如何设置第一优先和第二优先排序
- 第五个问题:循环写多了tle怎么破。
AC代码(含修改前代码于注释中)
#include <bits/stdc++.h>
#include <set>
using namespace std;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
set <int> s;
for(int i=0;i<=m;i++){
for(int j=0;j<=m;j++){
s.insert(i*i+j*j);
}
}
vector<int> vec(62501,0);
for(auto itr:s){
vec[itr]++;
}
int c=0;
for(int k=1;k<=2*m*m/(n-1);k++){
for(set <int>::iterator it= s.begin();it!=s.end();it++){
if((*it)+(n-1)*k>*(s.rbegin())){break;}
bool flag =1;
for(int time =0;time<n;time++){
if(!vec[(*it)+time*k]){
flag=0;
break;
}
}
if(flag){
cout<<*it<<" "<<k<<endl;
c++;
}
}
}
if(c==0){
cout<<"NONE"<<endl;
}
system("pause");
return 0;
}
过程:
- 第一个问题如注释,我拆分为了计算并储存这个两平方数和的集合以及遍历查找是否每一项都在这个集合内。
- 第二个问题,既然集合肯定set。
- 第三个问题:百度。
- 第四个问题:原本是打算用vector <pair<int,int>> vec;来保存并用sort()函数排序的。但是vsc给我说输入的参数不对?(用常量1,2不报错,用a,b变量就报错了)。然后就放弃了。后面改用循环解决(将外层循环的自变量设置为第一优先的变量,中间层为第二优先再输出即可)。
- 第五个问题:原本是三重循环+find()函数来判断该数是否存在于集合或者用三重循环+lower_bound()函数来实现此功能(因为lower_bound()函数理论上更快)但是反而用前者tle少一,不解。(两种代码均在注释)后面改为之前做过的计数的方法,另新建一个动态数组,然后把set容器内元素的值作为下标,动态数组存放该下标元素有的个数。如此就不必使用循环或其他函数就能快速判断该数是否在集合内。