摘要: 这题勾起我伤心的回忆啊就是这题,在北信夏令营测试上面作为D题原题,卡了我两三个小时,眼睁睁看着做过此题的ACMER们抢走机会,痛哉~Orz知耻而后勇,AC300发誓坚持到底,为尊严而战算法分析:其实这就是个简单的模拟题,用数组做就行,根本没必要用栈,当时还在反复想怎么用栈的STL,晕。用一个数组sequence很容易根据给出的P序列来还原括号序列,1代表作左括号,0代表右括号,每次赋值0之前先赋足够的1在它之前。然后根据sequence数组输出w序列,扫描数组,每遇到一个左括号,就计数它前面还没有匹配的第一个左括号是哪个,然后查这对匹配的括号之间有几个右括号输出即可。多简单的一道题,却由于没有 阅读全文
posted @ 2010-12-17 23:29 yangleo 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 在做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)与[.. 阅读全文
posted @ 2010-12-17 23:11 yangleo 阅读(402) 评论(0) 推荐(0) 编辑
摘要: 开始用了暴力枚举,后来一看数据这么大,估计肯定超时,无奈上网搜索了一下,考察的是扩展欧几里德算法,还有比较大的整数_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的整数解... 阅读全文
posted @ 2010-12-17 23:08 yangleo 阅读(191) 评论(0) 推荐(0) 编辑
摘要: #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 阅读全文
posted @ 2010-12-17 21:21 yangleo 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 在王晓东算法书上有讲解,是最大子序列和问题的拓广#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 阅读全文
posted @ 2010-12-17 19:17 yangleo 阅读(241) 评论(0) 推荐(0) 编辑