zoukankan      html  css  js  c++  java
  • Section 1.4 搜索

    Arithmetic Progressions

    http://www.wzoi.org/usaco/14%5C110.asp

    并没有看出哪里像搜索。。大概是我蠢,暴力过去了

    处理出所有的p^2+p^2的值,标记处有的值vis[i]

    在其中枚举a,以1-a+(n-1)*b<=2*m*m的限制枚举b,检查是否有n位的存在

    #include <bits/stdc++.h>
    using namespace std;
    const int N  = 140000;
    bool vis[N];
    int f[N>>1];
    struct point{
        int a, b;
        point(){};
        point(int _a, int _b){a = _a, b = _b;};
    
        bool operator<(const point &I)const{
            if(b == I.b)    return a <I.a;
            return b <I.b;
        }
    }p[10004];
    int main()
    {
        freopen("ariprog.in","r",stdin);
        #ifndef poi
        freopen("ariprog.out","w",stdout);
        #endif
        int n, m, i, j, k, a, b;
        cin >> n >> m;
        int id = 0, no = 0;
        for(i = 0; i <= m; i++){
            for(j = i; j <= m; j++) {
                f[++id] = i * i + j * j;
                vis[f[id]] = true;
            }
        }
        sort(f + 1, f + id + 1);
        id = unique(f + 1, f + id + 1) - f;
        int limit = 2 * m * m;
        for(i = 1; i < id; i++){
            a = f[i];
         //   printf("!!%d
    ", a);
            for(j = 1; j*(n-1)+a <= limit; j++){
                for(k = 1; k < n; k++){
                    if(!vis[j*k+a]) break;
                }
                if(k == n)  p[++no] = point(a, j);
            }
        }
        if(no == 0){
            printf("NONE
    ");
            return 0;
        }
        sort(p + 1, p + no + 1);
    
        for(i = 1; i <= no; i++){
            printf("%d %d
    ", p[i].a, p[i].b);
        }
    
        return 0;
    }
    View Code

    Mother's Milk

    http://www.wzoi.org/usaco/12%5C403.asp

    真。搜索。。以(0, 0, C)为初始,bfs一下,当a为0时记录c的值,因为很小,避免去重用vis标记

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 22;
    struct point{
        int a, b, c;
    
        point(){};
        point(int _a, int _b, int _c){a = _a, b = _b, c = _c;};
    };
    bool state[N][N][N], ok[N];
    int A, B, C;
    vector<int>ans;
    void bfs(){
        state[0][0][C] = true;
        queue<struct point>Q;
        Q.push(point(0, 0, C));
        struct point x;
        int temp, a, b, c;
        while(!Q.empty()){
            x = Q.front();
            if(x.a == 0)   ok[x.c] = true;
          // cout << x.a << x.b << x.c << endl;
            Q.pop();
            if(x.a){
                if(x.b != B){
                    temp = min(B-x.b, x.a);
                    a = x.a - temp;
                    b = x.b + temp;
                    c = x.c;
                   if(!state[a][b][c]){
                        Q.push(point(a, b, c));
                        state[a][b][c] = true;
                    }
                }
                if(x.c != C){
                    temp = min(C-x.c, x.a);
                    a = x.a - temp;
                    b = x.b;
                    c = x.c + temp;
                    if(!state[a][b][c]){
                        Q.push(point(a, b, c));
                        state[a][b][c] = true;
                    }
                }
            }
            if(x.b){
                if(x.a != A){
                    temp = min(A-x.a, x.b);
                    a = x.a + temp;
                    b = x.b - temp;
                    c = x.c;
                   if(!state[a][b][c]){
                        Q.push(point(a, b, c));
                        state[a][b][c] = true;
                    }
                }
                if(x.c != C){
                    temp = min(C-x.c, x.b);
                    a = x.a;
                    b = x.b - temp;
                    c = x.c + temp;
                   if(!state[a][b][c]){
                        Q.push(point(a, b, c));
                        state[a][b][c] = true;
                    }
                }
            }
            if(x.c){
                if(x.a != A){
                    temp = min(A-x.a, x.c);
                    a = x.a + temp;
                    b = x.b;
                    c = x.c - temp;
                   if(!state[a][b][c]){
                        Q.push(point(a, b, c));
                        state[a][b][c] = true;
                    }
                }
                if(x.b != B){
                    temp = min(B-x.b, x.c);
                    a = x.a;
                    b = x.b + temp;
                    c = x.c - temp;
                   if(!state[a][b][c]){
                        Q.push(point(a, b, c));
                        state[a][b][c] = true;
                    }
                }
            }
        }
    
    }
    int main()
    {
        freopen("milk3.in","r",stdin);
        #ifndef poi
        freopen("milk3.out","w",stdout);
        #endif
        cin >> A>> B>> C;
    
        bfs();
        bool first = true;
        for(int i = 0; i <= 20; i++){
    
            if(ok[i])  {
                if(!first)  cout << " ";
                cout << i;first = false;
            }
    
        }
        cout <<endl;
    
        return 0;
    }
    View Code

    考研好痛苦。好羡慕保研的。。

  • 相关阅读:
    LOJ 10160
    LOJ 10155
    2018-11-1 NOIP 模拟赛解题报告
    联考前停课集训随笔
    一个博客园代码高亮的方案
    详解使用 Tarjan 求 LCA 问题(图解)
    NOIP2018普及初赛解析
    关于CCR测评器的自定义校验器(Special Judge)
    日常,异常处理
    Androidstudio 编译慢 这样的体验肯定很多人都有!!!
  • 原文地址:https://www.cnblogs.com/bbbbbq/p/4641757.html
Copyright © 2011-2022 走看看