摘要:
最近各科的作业全部上来了,导致ACM没有时间做,计划元旦前后将所有作业搞定,之后准备考试,还有一段时间的GRE班,估计下次做题学算法的时候已经快要过年了。不管怎么样,过年期间也不可松懈,争取每天也做2-3题,为明年校赛做准备,加油吧 坚定走自己的路,积极地过好每一天,沉下心来每天实实在在练练编程,把握住未来的机会!加油! 发一篇心情日志自我鼓励一下 阅读全文
摘要:
对于任意一个序列i, i + 1, ..., j其最大的inversion number是全部逆序的情况,即j, j - 1, ..., i + 1, i,值记为in(i, j) = (j - i + 1) * (j - i) / 2所以这个问题的解决的步骤如下:(1)对于输入n, seq, 从后往前考虑找到可以涵盖seq值的i, 即in(i, n) >= seq(2)由(1)可知,i -> n足够用来表示值为seq的insersion number,所以1-> i - 1只要按照升序打印即可(3)剩下的i -> n如何表示值为seq的逆序数呢?考察几个例子不难发现.剩 阅读全文
摘要:
这题勾起我伤心的回忆啊就是这题,在北信夏令营测试上面作为D题原题,卡了我两三个小时,眼睁睁看着做过此题的ACMER们抢走机会,痛哉~Orz知耻而后勇,AC300发誓坚持到底,为尊严而战算法分析:其实这就是个简单的模拟题,用数组做就行,根本没必要用栈,当时还在反复想怎么用栈的STL,晕。用一个数组sequence很容易根据给出的P序列来还原括号序列,1代表作左括号,0代表右括号,每次赋值0之前先赋足够的1在它之前。然后根据sequence数组输出w序列,扫描数组,每遇到一个左括号,就计数它前面还没有匹配的第一个左括号是哪个,然后查这对匹配的括号之间有几个右括号输出即可。多简单的一道题,却由于没有 阅读全文
摘要:
在做ACM题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647。而unsigned范围是[0,2^32),即0~4294967295。也就是说,常规的32位整数只能够处理40亿以下的数。 那遇到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展了。不同的编译器对64位整数的扩展有所不同。基于ACM的需要,下面仅介绍VC6.0与g++编译器的扩展。 VC的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[.. 阅读全文
摘要:
开始用了暴力枚举,后来一看数据这么大,估计肯定超时,无奈上网搜索了一下,考察的是扩展欧几里德算法,还有比较大的整数_int64的处理。转自http://apps.hi.baidu.com/share/detail/16229280 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n*s)=k*l(k=0,1,2....) 稍微变一下形得: (n-m)*s+k*l=x-y 令n-m=a,k=b,x-y=c,即 a*s+b*l=c 只要上式存在整数解,则两青蛙能相遇,否则不能。 首先想到的一个方法是用两次for循环来枚举s,l的值,看是否存在s,l的整数解... 阅读全文
摘要:
#include <iostream>using namespace std;int main(){ int n,rc[101][101]; int i,j,tempsr[101],tempsc[101],x[101],y[101]; while(cin>>n,n!=0){ for (i = 0;i < n;i++) for (j = 0;j < n;j++) cin>>rc[i][j]; //若行的奇数和的个数不等于列的奇数和的个数则Corrupt //若均为0 则OK //若相等 则可作变换,可以一一配对得到交点就是变换点 memset(te 阅读全文
摘要:
在王晓东算法书上有讲解,是最大子序列和问题的拓广#include <iostream>using namespace std;int rec[102][102];int b[100];int main(){ int n,k,s,sum,max; int i,j; cin>>n; for (i = 0;i < n;i++) for (j = 0;j < n;j++) { cin>> rec[i][j]; } s = 0; for (i = 0;i < n;i++) { for (k = 0;k < n;k++) b[k] = 0; fo 阅读全文
摘要:
在刘汝佳黑书上有详细的解析,自己明天这两种算法自己实现一下,作为对动态规划的深入理解学习先转一个题解http://blog.163.com/leyni@126/blog/static/16223010220103155534476/?fromdm&fromSearch&isFromSearchEngine=yes问题:括号匹配问题。给出一个由括号组成字符串,加最少的括号使之匹配。思路:设f[i][j]为从i到j这段字串达到匹配所需最少括号数。初始状态:f[i][i] = 1;状态转移:f[i][j] = min{f[i + 1][j - 1 | s[i]与s[j]匹配],f[i 阅读全文
摘要:
这是一道比较简单的DP,通过分析可以设最后拿走的牌为i,则所求的最优解就是i左边和右边子列的最小连乘积再加上x[a]*x[i]*x[b],因为i将原来的序列划分为两个子列,这两个子列符合“最优子结构”和“重叠子问题”的dp特点,他们的最优解互相之间没有影响,只会影响全局问题的最优解,在POJ discuss中的解析比较经典,摘录如下,以后做题可以常常看看discuss,就当学习,但是还是要独立思考为主对于整个牌的序列,最左端和最右端的牌是不能被取走的,除这两张以外的所有牌> ,必然有一张最后取走。取走这最后一张牌有一个仅与它本身以及最左端和最右端的> 牌的值有关的得分,这个分值与其 阅读全文
摘要:
参考了slayer 的解答http://www.slyar.com/blog/poj-1029-cpp.html 与POJ 1013类比模拟题,抓两点,其一在等式中出现的硬币一定不是假币,其二在不等式中每次都出现即在不等式中出现的次数等于它出现的次数,一定是假币其他情况无法判断输出0#include <iostream>#include <string>using namespace std;const int MAX = 1001;int main(){ int i,n,k,p,count,pos,total = 0;//total标记不等式出现的次数,不等式中假币一 阅读全文