东华 OJ 一维数组竞赛 等差数列

心路历程和代码更改尽在注释中

因为正好在学STL,所以故意用容器来写的。但是因为不熟所以光写代码就挺久了。

问题描述:

  1. 第一个问题:问题如何拆分。
  2. 第二个问题:选择什么容器完成。
  3. 第三个问题:如何使用容器(bushi
  4. 第四个问题:如何设置第一优先和第二优先排序
  5. 第五个问题:循环写多了tle怎么破。

AC代码(含修改前代码于注释中)

#include <bits/stdc++.h>
#include <set>

using namespace std;

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    /*需求:
    * 找满足n的等差数列且b为第一优先,a为第二优先输出
    * 没找到输出NONE
    * 实现方法:
    * 首先以m为上限找到所有双平方数的集合(集合不能有重复元素)->set
    * 依次判断a_1、a_2···是否在set容器内有符合的元素//tle
    * 如果有继续判断,直至满足n个元素//tle
    * 如果无则break掉
    * 由题意,不会有任意n,m,使得a_n=a_m
    */
    set <int> s;
    for(int i=0;i<=m;i++){//set自动去重,排序
        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;//count
    //rbegin();访问最后一个元素的迭代器
    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(lower_bound(s.begin(),s.end(),(*it)+time*k)==s.end()){flag=0;break;}
                // if(*(lower_bound(s.begin(),s.end(),(*it)+time*k))!=(*it)+time*k){flag=0;break;}
                //if(s.find((*it)+time*k)==s.end()){flag=0;break;}//O(nlogn)
                //p.push_back(make_pair<int,int>(k,i));//make_pair只能常量赋值?
            }
            if(flag){//循环本身就升序
                cout<<*it<<" "<<k<<endl;
                c++;
            }
        }
    }
    if(c==0){
        cout<<"NONE"<<endl;
    }
    system("pause");
    return 0;
}

过程:

  1. 第一个问题如注释,我拆分为了计算并储存这个两平方数和的集合以及遍历查找是否每一项都在这个集合内。
  2. 第二个问题,既然集合肯定set。
  3. 第三个问题:百度。
  4. 第四个问题:原本是打算用vector <pair<int,int>> vec;来保存并用sort()函数排序的。但是vsc给我说输入的参数不对?(用常量1,2不报错,用a,b变量就报错了)。然后就放弃了。后面改用循环解决(将外层循环的自变量设置为第一优先的变量,中间层为第二优先再输出即可)。
  5. 第五个问题:原本是三重循环+find()函数来判断该数是否存在于集合或者用三重循环+lower_bound()函数来实现此功能(因为lower_bound()函数理论上更快)但是反而用前者tle少一,不解。(两种代码均在注释)后面改为之前做过的计数的方法,另新建一个动态数组,然后把set容器内元素的值作为下标,动态数组存放该下标元素有的个数。如此就不必使用循环或其他函数就能快速判断该数是否在集合内。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页