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位的存在
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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\n", 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\n"); return 0; } sort(p + 1, p + no + 1); for(i = 1; i <= no; i++){ printf("%d %d\n", p[i].a, p[i].b); } return 0; }
Mother's Milk
http://www.wzoi.org/usaco/12%5C403.asp
真。搜索。。以(0, 0, C)为初始,bfs一下,当a为0时记录c的值,因为很小,避免去重用vis标记
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
考研好痛苦。好羡慕保研的。。