zoukankan      html  css  js  c++  java
  • USACOArithmetic Progressions

    http://ace.delos.com/usacoprob2?a=WNyvQo2qbjE&S=ariprog

    额。。。比较水的题,综合起来有两种做法,一种是先算出所有的双平方数,然后在这个集合中枚举a,b。另一种是直接枚举a,b,然后再逐一判断是否为双平方数,不过这种方法超时的风险很大,要很多剪枝才行。

    鄙人果断方法一了。方法一如果不加入剪枝,5秒也是够呛的。而最简单有效的剪枝就是当a+b(n-1)>m时,根本不用再做下去了。

    对了,这里我发现了原来freopen是定义在cstdio头文件中的,一直不知道T_T

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    
    bool f[2500005]={0};
    int n,m,sum=0;
    struct node{
        int aa,bb;
        friend bool operator < (node a,node b)
        {
            return a.bb<b.bb;        //按照b的大小来排序
        }
    };
    
    void init()
    {
        cin>>n>>m;
        for (int p=0;p<=m;p++)
            for (int q=p;q<=m;q++)
                f[p*p+q*q]=true;         //直接用hash表,简单方便
    
    }
    
    node rr[10005];
    void work()
    {
        int h=0,dd=0,k,sum=0,mm=2*m*m;
        for (int a=0;a<=mm;a++)         //a,b的次序可以交换,但是如果b在前a在后则剪枝不方便了
        if (f[a])
        {
            for (int b=1;b<mm;b++)
            {
                if (a+b*(n-1)>mm) break;     //一个简单而强悍的剪枝,这里要是break,若是continue就根本没剪到了
                h=a; dd=b; k=0;
                while (f[h] && k<n)
                {
                    k++;
                    h=h+dd;
                }
                if (k==n) 
                {
                    rr[++sum].aa=a;
                    rr[sum].bb=b;
                }
            }
        }
        sort(rr+1,rr+sum+1);
        if (!sum) cout<<"NONE"<<endl;
        for (int i=1;i<=sum;i++)
            cout<<rr[i].aa<<" "<<rr[i].bb<<endl;
        return;
    }
    
    int main()
    {
        freopen("ariprog.in","r",stdin);
        freopen("ariprog.out","w",stdout);
        init();
        work();
        return 0;
    }
  • 相关阅读:
    解决IE新开窗口无法显示内容的问题
    日历控件
    关于索引,我们可以知道的更多 全表扫描和索引扫描
    C#构造函数的小说明
    动态创建的组件的ID设定
    正则表达式使用详解
    “运行”命令全集
    数组型参数
    接口实现的继承机制
    读取XML文件
  • 原文地址:https://www.cnblogs.com/ay27/p/2718735.html
Copyright © 2011-2022 走看看