USACO Section 1.4 More Search Technique
来源:互联网 发布:单片机dl是什么意思啊 编辑:程序博客网 时间:2024/04/29 04:20
Orz, 感觉题已经慢慢开始变难了, 快要刷不动过了... 不知道我还能坚持刷多久。
Arithmetic Progressions
题意:一个可以表示为两个完全平方数相加的数被称为 bisquares (双平方数?), 给定底数的上限, 求这些底数两两构成的 bisquares 的集合中能构成项数为 n 的等差数列有哪些,要求输出首项和项数。
由于是搜索专题, 就以为是搜索题(其实就是搜索题),蓝儿我看了下确定了上下界之后就死命 tle, 令我一度怀疑我算法错了, 直到最后打算在原来的基础上进行一些优化, 把第二层循环的上限由 2 m^2 改为了 bisquares 的集合数之后就神奇的 AC 了, 虽然我认为复杂度并没有改变 ( 虽然的确降了几倍, Orz ...)
#include <bits/stdc++.h>using namespace std;const int N = 200000;bool v[N];int n, m;int f[30000], a[N];vector <int> s;void init(int m) { for (int i = 0; i <= m; i++) { for (int j = 0; j <= m; j++) { v[i * i + j * j] = 1; } } for (int i = 0; i <= m * m * 2; i++) { if (v[i]) { a[i] = s.size(); s.push_back(i); } }}bool ok(int x, int d, int p) { if (p == n) return 1; int w = s[x] + d; if (w > m * m * 2 || !v[w]) return 0; return ok(a[w], d, p + 1);}int main() { freopen("ariprog.in", "r", stdin); freopen("ariprog.out", "w", stdout); scanf("%d %d", &n, &m); init(m); int cnt = 0; for (int i = 1; i * (n - 1) <= m * m * 2; i++) { memset(f, 0, sizeof f); for (int j = 0; j < s.size() && s[j] + i * (n - 1) <= m * m * 2; j++) { if (ok(j, i, 1)) cnt++, printf("%d %d\n", s[j], i); } } if (!cnt) puts("NONE");}
题意:有三个瓶子可以倒来倒去,问当 A 瓶空时, C 瓶可以有哪些状态。
写个瓶子的结构体 bfs 即可。
#include <bits/stdc++.h>using namespace std;const int mx = 21;struct bucket { int v, u; void to(bucket *a) { int t = min(u, a->v - a->u); u -= t; a->u += t; }};struct state { bucket a[3]; state() {} int st() { return a[0].u * mx + a[2].u; }} b;bool v[mx * mx];vector <int> ans;void bfs() { queue <state> q; q.push(b); v[b.st()] = 1; while (q.size()) { state now = q.front(); q.pop(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) continue; state nxt = now; nxt.a[i].to(&nxt.a[j]); if (v[nxt.st()]) continue; v[nxt.st()] = 1; if (!nxt.a[0].u) ans.push_back(nxt.a[2].u); q.push(nxt); } } }}int main() { freopen("milk3.in", "r", stdin); freopen("milk3.out", "w", stdout); scanf("%d %d %d", &b.a[0].v, &b.a[1].v, &b.a[2].v); b.a[0].u = b.a[1].u = 0; b.a[2].u = b.a[2].v; int n = b.a[2].v; bfs(); ans.push_back(n); sort(ans.begin(), ans.end()); unique(ans.begin(), ans.end()); for (int i = 0; i < ans.size() - 1; i++) printf("%d ", ans[i]); printf("%d\n", n);}
0 0
- USACO Section 1.4 More Search Technique
- USACO Section 1.2 Complete Search
- USACO 之 Section 1.2 Complete Search
- USACO Section 1.4 题解
- USACO Section 1.4
- USACO Section 1.4 packrec
- USACO Section 1.4
- [USACO Training] Section 1.4
- USACO Section 1.4 Packing Rectangles
- USACO Section 1.4 The Clocks
- USACO Section 1.4 Packing Rectangles
- USACO Section 1.4 Arithmetic Progressions
- 等差数列 [USACO Training Section 1.4]
- USACO-Section 1.4 Arithmetic Progressions
- USACO Section 1.4 Arithmetic Progressions
- USACO 1.4 Search Techniques
- [USACO 1.4] Summary of Section 1.4
- USACO Section 1.4 Mother's Milk 搜索
- android学习:android Activity生命周期的七个方法测试
- 短信发送
- Count and Say
- 设计模式 装饰者模式
- 线索化中序、先序、后序遍历二叉树的方式(待补充完整)
- USACO Section 1.4 More Search Technique
- WebService之Axis2系列教程Axis2与Spring集成发布
- iOS 中关于copy和mutable copy的理解
- socket编程原理
- php实现验证码
- Android 6.0 权限模型——Permissions
- SecureCRT不能输入字符
- linux之nm命令
- 猫猫学iOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介