摘要: 题意:地球纬度长L,青蛙A和青蛙B同时向西跳,起点分别为x,y,速度分别为m,n,问多久相遇?分析:( x + mt ) - ( y + nt ) = kL=>( m - n ) t - ( y - x ) = kL=>( m - n ) t - kL = ( y - x )令 a = m - n , b = L , c = y - x , X = t , Y = k则原等式转换为 aX-bY=c, 剩下就是扩展gcd了。。LL gcd(LL x, LL y){ if (!x || !y) return x + y; for (LL t; t = x % y; x = y, y.. 阅读全文
posted @ 2013-05-26 22:42 心向往之 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 题意:一个数列,每次可交换两个数,交换的代价为这两个数的和,要把这些数按升序排列,问最小的代价?分析:对于任意循环i,设长度为ki,则至少交换ki-1次,即每次让一个元素到达正确位置,第ki-1个到达后,第ki个自然也在正确位置。一种方法是让最小元素ti参加所有交换,其它元素各参加一次,总代价为:sum(i)+(ki-2)*ti, sum(i)为循环i所有元素之和。 另一种方法是让ti和n个数中最小的数m交换,然后m和循环里的其它数交换,最后再让m和ti交换,总代价为:sum(i)+ti+(ki+1)*m,最终答案为两种代价的较小者。。const int maxn=10005;struct n 阅读全文
posted @ 2013-05-26 22:30 心向往之 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 题意:问一个置换f,能不能表示成两个置换g的平方?分析:奇置换的平方为一个等长奇置换 偶置换的平方为两个原置换一半长度的置换所以如果有两个相同长度的偶置换,则可以由另一个2倍长度的偶置换平方得到,求出不同长度的偶置换的个数,若都为偶数个,则f可以表示成g*g,否则不可以。int n;char s[27];int b[27],c[14];int main(){ scanf("%d",&n); while(n--){ scanf("%s",s); memset(b,0,sizeof b); memset(c,0,sizeof c); ... 阅读全文
posted @ 2013-05-26 22:19 心向往之 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 题意:6个数字,每次可以左移/右移光标,或将光标所在数字加一/减一,或将光标所在数字与第一个/第六个数字交换,问达到目标数字,最少需要多少次操作?分析:操作可以分成两部分考虑:移动光标和交换改变了原数字的位置,而加一减一改变数字的大小。先bfs出012345所能达到的所有状态,以及达到此状态光标经过了哪些数字。再针对新状态和目标状态,如果某一位数字不一样并且光标经过这一位,则可以改变此数字的大小,若没经过,则此状态无法达到目标状态。表达起来太费劲了,直接看代码吧。另外,据说左移操作是多余的,把代码中左移部分去掉,也AC了,但还是感觉有问题。。 有空再想吧。。const int M = 567; 阅读全文
posted @ 2013-05-26 20:46 心向往之 阅读(403) 评论(0) 推荐(0) 编辑
摘要: 题意:n×m (1<= N, M <=477) 的矩阵,a[i][j]表示第i行第j列的能量值,可以从任意点出发,任意点停止,但只能往右或往下走。第一步给自己补充能量,第二步给剑补充能量,依次循环补充。能量值0~10,若当前为10,又补充了1的能量,则能量变成0。要求离开的时候,人和剑的能量值相同,问有多少种不同的走法?结果对1 000 000 007取余。分析:枚举人和剑的差值,人比剑多s,相当于人比剑少11-s。。。设dp[x][y][i]表示在(x,y)位置,差值为i的方案数,dp[x][y][i] = ( dp[x][y][i] + dp[x+1][y][j] ) 阅读全文
posted @ 2013-05-26 14:12 心向往之 阅读(167) 评论(4) 推荐(0) 编辑