上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 15 下一页
摘要: 求一个K进制下是N的倍数的数,要求这个数使用的数字最少,数字个数相同时取较小的数。 首先有一个结论,至多用两个数字可以构造任意数的倍数。假设只有一个数字吗,由这一个数字构成的数模N的结果只能是0~N-1,由抽屉原理可知必然存在两个数模N的结果相同,这两个数一减,结果有两个数字构成,模N的结果是0。 然后就暴力BFS吧,队列中存的是余数,找到余数为0或者出现已经出现过的余数就返回。每次找到解比较跟新一下即可。 1 #include <string.h> 2 #include <stdio.h> 3 #define MAXN 10005 4 int n, k, num[2] 阅读全文
posted @ 2012-09-20 07:43 Burn_E 阅读(204) 评论(0) 推荐(0)
摘要: 又是POJ原题,这网赛是有多少原题。。一些人站队,但有的一排站了多个人,每个人告诉你他前面有多少个人,后面有多少个人,问说实话的人最多有多少个。 比赛的时候没想法,大叔过的这一题。赛后看了解题报告才发现思想原来是那么简单。p[i][j]表示说前面i个人,后面j个人这个区间说实话的最大人数,有一个人说i,j就加一,注意不能超过n-i-j,然后d[i]表示i前面区间都已经确定时说实话的最大人数。d[i]=max(d[j]+p[j][n-i])。 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorit 阅读全文
posted @ 2012-09-20 07:34 Burn_E 阅读(173) 评论(0) 推荐(0)
摘要: 据说也是原题,N个人,F种食物,D种饮料,每种食物和饮料都有一定的数量,而每个人都有自己喜欢的食物和饮料,当一个人拿到自己喜欢的食物之一以及喜欢的饮料之一时,这个人能够被满足。求最多能满足多少人。 看到题就觉得是网络流,但一时没想到怎么建图,斌牛一看题就说是原题,然后啪啪啪敲完键盘就过了。。 食物放左边,饮料放右边,人放在中间,拆成两个点,点间流量为一,然后左点连喜欢的食物,右点连喜欢的饮料,再加个源点和汇点,做一遍网络流就OK了。。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm& 阅读全文
posted @ 2012-09-20 07:25 Burn_E 阅读(167) 评论(0) 推荐(0)
摘要: 求g(g(g(n))) mod 109 + 7,已知g(n) = 3g(n - 1) + g(n - 2),g(1) = 1,g(0) = 0。 因为每两个数只和前两个数有关,所以模之后必然会出现循环节。现在只知道最外层的循环节,所以要把内两层的循环节暴力出来。有了三层的循环节之后用二分矩阵就可以了。 1 #include <string.h> 2 #include <stdio.h> 3 typedef long long LL; 4 struct matrix{ 5 LL mz[2][2]; 6 void init(int type){ 7 memse... 阅读全文
posted @ 2012-09-20 07:18 Burn_E 阅读(161) 评论(0) 推荐(0)
摘要: 图上的每个点有权值,求使从起点无法到达终点去掉的权值和最小。 因为权值在点上,所以要进行拆点。将i点拆为2i和2i+1。然后流量统一从偶数点进,奇数点出,点之间连流量为点权的有向边,无向边拆成两条有向边,分别向两个端点连两条流量为无穷大的有向边,如下图所示。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 #define MAXN 500 5 #define MAXE 100000 6 #define INF 0x3f3f3f3f 7 struct edge{ 8 int 阅读全文
posted @ 2012-09-20 07:12 Burn_E 阅读(221) 评论(0) 推荐(0)
摘要: 维护一个可以插入删除的有序序列,每次询问序列中位置mod5=3的数的和。 CodeForces原题,因为时限给的太宽,数据太水,STL可以暴力过。 用线段树和平衡树都可以做这题,线段树需要先离散化,然后每个区间五个标记分别保存到这个区间左端点的距离mod5=0~4的和,以及一个标记保存这个区间数的个数。合并区间的时候,左儿子因为左端点相同可以直接合并,而右儿子需要推一下,假设左儿子有Num个元素,右儿子本来Mod5=K的点,合并之后到左端点Mod5的值为(num%5+K)%5,所以sum[p][i] = sum[p<<1][i] + sum[p<<1|1][(i-num 阅读全文
posted @ 2012-09-20 06:58 Burn_E 阅读(176) 评论(0) 推荐(0)
摘要: 直接map就水过去了。。 1 #include <map> 2 #include <string> 3 #include <stdio.h> 4 #include <iostream> 5 using namespace std; 6 map<string,int> mp; 7 string s[5005],s1; 8 int cas,n,m,cc[]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9}; 9 main(){10 for(cin>>cas;cas--; 阅读全文
posted @ 2012-09-14 11:53 Burn_E 阅读(132) 评论(0) 推荐(0)
摘要: 这题比较容易想到的做法是splay,但是splay写起来比较麻烦而且每次操作都有LogN的复杂度,双向链表也是可以实现的,但实践起来比较麻烦,尤其是翻转操作。。。 可以发现每次L或者R都是移动一位的,我们可以用更简单的数据结构来实现,用两个栈分别存L左边和R右边的数据,L和R中间的数据使用一个双端队列来保存,因为涉及到翻转操作,要用一个dir来表示当前的双端队列哪边是头哪边是尾。。。 对于题目中给出的七种操作,都可以在O(1)的复杂度内实现,为了描述方便,左栈代表L左边数的栈,右栈代表R右边数的栈。 1,MoveLeft L/R 左移左指针就是把左栈中栈顶的数弹到双端队列头部,左移... 阅读全文
posted @ 2012-09-14 11:51 Burn_E 阅读(373) 评论(0) 推荐(0)
摘要: 给出N个城市,城市之间的路径需要一定的花费。其中一些城市(H<=15)是必达的,在这些城市可以打工赚钱,但前提是有足够的钱购买这些城市的工作许可。问是否能获得所有的许可并且最终回到起点。 这题和我之前出过的一个题很像。。http://acm.csu.edu.cn/onlinejudge/problem.php?id=1175 先对这H个点做一遍最短路,这题的点比较少,直接用FLOYD,然后对这H个点用哈密顿回路DP就可以了。 需要注意的是一个城市允许经过多次,如果第一次来这个城市时不够钱购买工作许可可以在其他城市工作赚了钱之后再回来拿。。。 1 #include <string.. 阅读全文
posted @ 2012-09-14 11:24 Burn_E 阅读(231) 评论(0) 推荐(0)
摘要: 有一个栈,你可以把这个栈中的数吐到另一个栈中去,然后每次可以从两个栈中选择一个数出栈,使∑num[i]*(i-1)最小,num[i]代表第i个出栈的数。 比赛的时候一直没想法,看了解题报告才恍然大悟。。对于每个区间,枚举第一个人是第几个出栈的,假设区间是[L,R],第一个人是i个出栈的,那么这个栈就被分成了三部分,[L,L],[L+1,L+i],[L+i+1,R],对后面两个区间看作子问题继续DP,注意对后面一个区间要加上(sum[R]-sum[L+i-1])*i,sum[i]表示前缀和。 1 #include <stdio.h> 2 #include <string.h&g 阅读全文
posted @ 2012-09-14 11:12 Burn_E 阅读(199) 评论(0) 推荐(0)
上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 15 下一页