思路: 枚举. 实现: #include <iostream> #include <cstdio> #include <algorithm> using namespace std; ; int prime[MAX_N]; ]; int init(int n) { ; ; i <= n; i++) is_prime[i] = true; is_prime[] = is_prime[] = false; ; i <= n; i++) { if (is_prim…
[题目链接]:http://hihocoder.com/problemset/problem/1493 [题意] [题解] 枚举P从2..n/2 如果P是质数且N-P也是质数; 则输出P和N-P就好; [完整代码] #include <bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define rep1…
原题链接 矩形分割 算法分析: 解决该题要用到"并查集"的思想. 这里有一篇不错的博客介绍并查集: 并查集(Union-Find)算法介绍 记 int total=N*M,这里会有 total 个方块,因为一道对角线(''或者'/')会把一块方块分割为左右两部分,所以,我们把任意一块方块看做左右两个部分.对于左部分,从左到右从上到下依次编号为 0~total-1:对于右部分,从做到右从上到下依次编号为 total~2*total-1;用一个 int parent[20000] (因为1…
原题链接 一面砖墙 算法分析 设墙的宽度为 range,则需要统计横坐标为 1,2,3,4,...,range-1 处的墙缝数,取最大的墙缝数(记为maxCrevices),从该处划一道竖线,竖线穿过的砖块数据最少,为N-maxCrevices;当然,输数据中不可能所有的坐标处都有裂缝,所以,我们只需考虑有裂缝的坐标处就行了.这里需要用到map<int,int>数据结构,key 为坐标,value 为该坐标处的裂缝数.统计出最大的裂缝数就能解决问题了. C++算法实现: #include<…
思路: 可能数据太水了,随便乱搞就过了. 实现: #include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; ], n; int main() { int t; cin >> t; while (t--) { ll maxn = ; cin >> n; ; i < n; i++) { cin >…
思路: 模拟,深搜. 实现: #include <iostream> #include <cstdio> #include <string> using namespace std; ] = { , , , - }; ] = { -, , , }; ; ][]; ][]; void dfs(int x, int y) { vis[x][y] = true; ; i < ; i++) { int nx = x + dx[i]; int ny = y + dy[i];…
思路: 就是求哪个长度出现的次数最多. 实现: #include <iostream> #include <cstdio> #include <algorithm> #include <map> using namespace std; ]; map<int, int> mp; int main() { ; cin >> n; ; i < n; i++) { cin >> x; ; ; j < x; j++)…
[题目链接]:http://hihocoder.com/problemset/problem/1496 [题意] [题解] 先把这n个数排个序吧. 这样相邻的数字就在一起了; 这样a[i]&a[i+1]的值肯定是尽可能地大了; 然后乘上a[i]*a[i+1]再取max就好; 奇怪的贪心. 我是想不到反例啦. [完整代码] #include <bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define…
[题目链接]:http://hihocoder.com/problemset/problem/1495 [题意] [题解] 把每个方块都再分成3*3的小块; 这样; 对于一个方块来说 如果是'\' 则把 (3*x,3*y)和(3*x+1,3*y+1)以及(3*x+2,3*y+2)都占据了 表示这些点是线. 如果是'/' 则把 (3*x+2,3*y)和(3*x+1,3*y+1)以及(3*x,3*y+2)都占据了 也表示这些点是线; 那些不是线的方块就置为空白区域; 这样就能够用一个个方块来表示空白…
[题目链接]:http://hihocoder.com/problemset/problem/1494 [题意] [题解] 显然只要记住每一行的各个砖头的间隔处的坐标有多少个就好了: ->也就对应了从这个地方画一条竖线上去,能少碰到多少个砖头; 取少碰到的砖头数的最大值; 然后用N减去它就好: 直接用map搞 [完整代码] #include <bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define…