摘要:
看到这道题,确实让我想到了dfs,但是p=100的上限让我望而却步,,,,后来知道dfs+强剪枝或者称为记忆化搜索dp这道题为什么记忆化搜索后变得这么高效呢,从4^100>>>64000*100是怎么转变的呢,原因是这道题的特设条件,(-32000,32000)顶多有64000个状态,每个数有可能在100层中的任何一层的话,那么时间复杂度就变成了64000*100了这就是记忆化在特定区域内的作用。。。。。代码如下:#include #include #define M 105
int st[M], targe, n, pa[M], dp[M][64010];
int dfs( 阅读全文
摘要:
大水题。。。比较前缀,,,,,代码如下:#include #include #define M 105
char st[M][M];
int path[M], fl[M];
int get_result(int a, int b)
{ int len = strlen(st[a]); for(int i = 0; i < len; i++) if(st[a][i]!=st[b][i]) return i; return len;
}
int main ()
{ int t, n, ans, max; scanf("%d",&t); w... 阅读全文
摘要:
这个题的思路很抽象,如果一头扎进去是很难出来的,我们要站在一个高度看这个问题。其实一个任务的完成不一定只靠一个蚂蚁,:::case:一个蚂蚁A朝一个方向走,当它撞到另一只蚂蚁B的时候,虽然A按照原速朝反向走,B却朝A的方向走去了,我们可以认为A把他的任务交给了撞它的那只蚂蚁B来完成了,假如B后来再次撞到其他蚂蚁的话,那么A的这个任务继续接力似的传递下去,同理刚才A接走了B当时携带的任务,所以每只蚂蚁都能完成自己的路程。我们也可以认为每只蚂蚁都会虚体,都不会撞着对方。这样以来,题目就简单了。代码如下:#include #include int main ()
{ int cas, l... 阅读全文
摘要:
选取最少的区间来覆盖[0,M]。。。基本思想都是排序,然后处理但是难点是怎么处理100 85 98 10这样的样例,因为5,9夹在上下两者之间,但是这个区间是不起作用的,有办法避免[5,9],这个题就简单了代码:#include #include #define M 100010
int m, a[M][2], pa[M];
int comp(const void *a, const void *b)
{ int *aa = (int*)a, *bb = (int*)b; return aa[0]-bb[0];
}
int main ()
{ int cas, n,... 阅读全文
摘要:
经典的贪心题目,先放大的,3x3/4,4x4,5x5,6x6,这些只能占据一个包裹的物品,再放那些小的,,,对于那些小的,先放缝隙,然后在占据新的包裹。这道以前做过,但是代码太繁琐了,经过精简,代码如下:#include int pake[7];
int main ()
{ int n, s, ok, tt; while(1) { ok = 0; for(int i = 1; i 0) { n+=pake[1]/36; if(pake[1]%36) n+=1; ... 阅读全文