摘要:BFS,直接入队即可。# include <cstdio># include <queue># include <cstring>using namespace std;# define N 100 + 5int n;char g[N][N];char vis[N][N];struct pos{int x, y, d;};pos st;queue <pos> Qst[10];const int dx[] = {0,0,1,-1};const int dy[] = {1,-1,0,0};int bfs(void){ queue <pos>
阅读全文
摘要:------------------------------------------------------------------------------------线段树的区间操作:修改区间内的值,反转区间内的值,区间查询;------------------------------------------------------------------------------------Description维护一个只有0和1的整数序列,支持以下操作:1 x y v : 将区间[x,y]之间的所有整数都变为v(v为0或1);2 x y : 将区间[x,y]之间所有的1变为0,所有的0变为
阅读全文
摘要:Description 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6 移动3次可达到目的: 从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9...
阅读全文
摘要:这道题对枚举时限比较严,在写 check 函数时要注意边界不能超,因为超出边界有可能引用了上一组残留的数据,而使用 memset() 则会超时。# include <stdio.h># define N 1005# define DIR 4 const int dir[][2] = {{0,1}, {1,0}, {0,-1}, {-1,0}};int n, m;char b[N][N];char check(int i, int j){ char ch; int cnt, s; for (cnt = 1, s = i-2; s<i+2; ...
阅读全文
摘要:Description中南大学ACM的暑期集训马上就要开始了,这次集训会将全体N名集训队员(编号分别为1, 2, …, N)按集训选拔赛的排名分成两组,前K名队员分入A组,其余队员分入B组。但现在助理教练CSGrandeur一不小心把集训选拔赛的排名弄丢了,而之前又没将A组和B组的人员确定出来,于是CSGrandeur打算问一下集训人员他们的名次各是怎样的,以此来确定一下A组的队员。然而集训队员们都视名次如粪土,只是隐约记得某些人排在了自己的后面,最终反馈到CSGrandeur这里的一共有M条信息,每条信息都可以用一个二元组(x, y) (x!=y)表示,含义为第x名队员记得第y名队员的排名比
阅读全文
摘要:马可以从任意位置出发,走遍整个棋盘;先用 bfs 求出马到达每个位置的最短时间 Ti,然后模拟将的移动,当将移动的时间 Tk 满足 Tk>=Ti 且Tk-Ti为偶数时相遇(马可以在两个位置徘徊一会等待将的到来);# include <stdio.h># include <string.h>const int dir[][2] = {{1,2}, {2,1}, {-1,2}, {1,-2}, {-2,1}, {2,-1}, {-1,-2}, {-2,-1}};int nx, ny, kx, ky;char vis[9][8], dis[9][8];void bfs(
阅读全文
摘要:这道题也是搁了很久了,这次百度之星初赛中有道题感觉很相似,还是不会……,中午看status时,看到有个牛过了这道题,于是搜了搜,发现都是说用01二叉树来解决的,我没细看他们的方法,自己研究了一下,最后AC了,因为将一个 char 当成 8 位来用,所以空间是很小的; 我的思路可能不太一样,还有些暴力的痕迹,不过因为使用了位运算,加速比较明显:二叉树用数组来做,输入一个数时,顺带将这个数在二叉树中所经历路径用 1 来标记,然后遍历这些数一遍,对每个数,找出二叉树中已经标记的与这个数距离最远的叶结点,相当于对每个数在其他数中找到和它异或最大的那个,然后把这个异或的结果来更新 ans ,就可以找..
阅读全文
摘要:地图很小,50×50,所以普通的BFS就行了;1WA:地图用%s读取时,读入的是字符0,在判断是否有路径时和数值0比较。 1 # include <stdio.h> 2 # include <string.h> 3 4 typedef struct {short x, y;}queue; 5 6 const short dir[4][2] = {{-1,0}, {1,0}, {0,-1}, {0,1}}; 7 8 int r, c, sr, sc, er, ec; 9 char m[55][55], v[55][55], d[55][55];10 queue
阅读全文
摘要:题意:若第二小生成树代价与最小生成树代价相等输出Not Unique!,否则输出最小代价;对最小生成树的每一边标记后重新计算不含这条边的最小生成树,若代价与 MST 的相等说明有多种方案,复杂度为O(N^3)。# include <stdio.h># include <string.h># define N 20005typedef struct{ int u, v, w;} Road;char f[N], use[N];int n, m, p[205];Road r[N];int cmp(const void *x, const void *y){ return (*
阅读全文
摘要:本来想水过的,结果提交了2次都是WA,就沉下心了;类似fib数列,写出几项,可以猜测递推公式为f[n] = f[n-1] + 2×f[n-2],稍加分析:正确;稍作变形有:1. f[n] + f[n-1] = 2×(f[n-1] + f[n-2])2. f[n] - 2×f[n-1] = -(f[n-1] - 2×f[n-2])所以可以求出 f[n],这里使用第一个式子得到了f[n] + f[n-1] = 2^(n-1),所以 f[n] = 2^(n-1) - f[n-1],2的幂可以使用移位,没问题吧;题目中0<n<65,所以这样做会遇到2
阅读全文
摘要:……;给出可以走的位置,问最多能爬多少层,使用dp,这道题有点不同的是还可以往下走,而常见的大都是递推,需要多加一个条件,谢谢Staginner大牛的指点!dfs可能会超时(深度太大)?为什么使用C++提交而不是C?在COJ上遭遇过使用C比C++耗时超出3s的经历(时限是5s)。# include <stdio.h># include <string.h># define N 105 char map[N][N];int n, m, f[N][N]; int dp(int i, int j); int main(){ int i, j, h; while (~scanf
阅读全文
摘要:玩过这个游戏,这个题是判断当前局面是属于哪一种:有三个连在一块,换一个位置后有三个连着,其他情况;思路有两种:对每一个位置枚举周围所有可能的情况,然后判断,或者对每一个位置移动前后行和列的情况进行判断;如果使用前一种,可能遭遇大量的判断,难以保证能考虑全所有情况,代码也显得很长,后一种代码稍短,相对好写一点;924MS,怎么没卡一下?# include <stdio.h>const int d[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};int n, m, f0, f1;char f[1005][1005];int check(int i, int j)
阅读全文
摘要:经过 Staginner 大牛的悉心指点,终于AC了(虽然那个测试数据有点小小的问题);dp好题(对于像我这样的初学者来说,是一道有新意的题);# include <stdio.h># include <string.h># define MAXN 1005int n;char g[MAXN], s[MAXN], f[MAXN][MAXN];int dp(int i, int j);int main(){ int i; while (~scanf("%d", &n)) { for (i = 1; i <= n; ++i) s...
阅读全文
摘要:题目:在一个由N个整数组成的数列中,最多能找到多少个位置连续的整数且其中的最大值与最小值之差不超过K呢?GDKOI 2003 又一道很类似的题(河床)使用的是动态规划,因为数据范围较小(复杂度为O(nk)),这里10^6*10^6肯定超时(确实TLE了);这里使用一次扫描,加上单调队列,将复杂度降为O(n)(每个元素最多只进队一次,最多只出队一次),当然不是自己的思路……详见“CSU_BMW正式组建纪念赛”解题报告以及COJ1170(A Simple Problem)这两篇,LJ大牛的代码比较清晰;WA无数次,TLE多次,RE两次,魔法值-50。。。# include <stdio.h&
阅读全文
摘要:进制转换,注意边界(WA 5次)。测试数据:26 27 52 160 Z FD结果: Z AA AZ FD 26 160# include <stdio.h># include <ctype.h># include <memory.h> char a[15];char s[15]; int main(){ int T, i, n; scanf("%d", &T); while (T--) { scanf("%s", a); if (isdigit(a[0])) { i = 0; n ...
阅读全文
摘要:这道题的HINT彻底把我弄糊涂了,结果WA5次才发现是求最大子序列而不是连续子串:HINT子序列的定义:字符串S中从S[ i ]...S[ j ]的长度为K的字符(i<=j),k<=j-i+1。# include <stdio.h># include <memory.h># define MAX(x, y) ((x)>(y) ? (x):(y))# define MAXN 1020int len1, len2;char s1[MAXN], s2[MAXN];short int f[MAXN][MAXN];int main(){ int i, j, ma
阅读全文
摘要:这道题的变态之处在于有下述的“蹩蹄”的情况出现,据不完全统计,24次非WA提交中,有15次左右是我的,多亏了LJ大牛及时指出这道题的陷阱。BFS或者DP,要注意会出现“蹩蹄”的情况(题目提都没提)。DP相对容易一些(记忆化搜索),要注意的一点是可能出现马永远无法到达将的位置,这时可能会出现两个状态相互调用以致出现死循环,解决的办法是:初始化时所有状态都定义为-1(将的位置定义为0,因为不许要移动),在求当前状态时,如果没有搜索过,首先将该状态置为+INF,这样及时无法搜索道,当结束时,依然为INF……这样对吗?经过验证,发现只要棋盘的行和列都大于等于4,那么马可以从任意位置出发经若干步到达任意
阅读全文
摘要:记忆化搜索,dp;前面WA的原因是状态转移时,对机器人位置的转移考虑补充分,使用vis[]标记只能保证相邻的状态的转移是正确的;需要增加一个额外的参数标记机器人所在位置,这样在递归时才能保证状态的转移是正确的(不会交叉);感谢LJ大牛!感谢C++!(使用C提交超时,原因不明,排除了OJ的原因,对数据预处理的C代码很快通过,百度"C++比C快"的结果都是C比C++快,无语)。 1 # include <cstdio> 2 # include <iostream> 3 # include <cstring> 4 5 using namespa
阅读全文
摘要:经过一位大牛的指点,放弃了使用分治的念头,看来快排还是很灵活的。 1 # include <stdio.h> 2 # include <stdlib.h> 3 4 # define MAXN 100005 5 6 typedef struct { 7 int X, Y; 8 int I; 9 }data;10 11 data a[MAXN];12 13 int cmp(const void *a, const void *b)14 {15 if ((*(data*)a).X == (*(data*)b).X)16 return (*(data*)a)...
阅读全文
摘要:实际上就是求第(<=)600000个素数,但是。。要优化内存,要优化速度。。最重要的要估计第600000个素数有多大,直接打印当然行,但是。。总之学了素数定理:1/ln(n)的分布。。 1 # include <stdio.h> 2 3 # define MAXN 600005 4 # define LN 15 5 # define INDEX(i) ((i) >> 5) 6 # define OFFSET(i) ((i) % 32) 7 # define GET_BIT(i) ((ptable[INDEX(i)]>>OFFSET(i)) &
阅读全文