- 博客(435)
- 资源 (4)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 开始你的ACM-ICPC之旅(转)
我觉得这样的文章应该有人写过的,但是Google里面貌似没有(或许有英文版)Baidu给了一个,不过不是很像样http://baike.baidu.com/view/94274.htm那我就写一个吧,这也是momodi大牛在上个学期初委托给我的一件事情。这篇文章面
2011-09-19 11:00:13
2674
原创 poj 2243 Knight Moves
//这题和1915是一样的题目,只不过这题的输入需要进行转换,还有这题没有给出具体的棋盘和棋子的//走法,如果对国际象棋不熟悉的人来讲,是很难读得明白题意的,棋盘和棋子的走法可以参照1915题! #include #include #include using namespace std;const int MAX = 15; map m; string input1, inpu
2012-09-02 09:13:05
858
原创 poj 1562 Oil Deposits
//和2386是一模一样的题目,当我在这题用c语言的输入的时候,就出错了,应该是有多个空格或者回车键在//数据的后面,还是不是很懂c语言的输入,特需要注意! #include #include using namespace std;const int MAX = 110;char matrix[MAX][MAX];int n, m, vis[MAX][MAX], ans;//每一
2012-09-02 08:30:02
786
原创 poj 2386 Lake Counting
#include #include using namespace std;const int MAX = 110;char matrix[MAX][MAX];int n, m, vis[MAX][MAX], ans;//每一个点的八个方向坐标的增减! int dir[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1,
2012-09-01 23:13:26
725
原创 poj 1915 Knight Moves
#include #include using namespace std;const int MAX = 310;int map[MAX][MAX], row, r, l, sx, sy, ex, ey;bool vis[MAX][MAX];//坐标的变换,即是可以移动的方格 int dir[8][2] = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}
2012-08-31 09:37:55
647
原创 poj 1321 棋盘问题
#include using namespace std;const int MAX = 10;char map[MAX][MAX];int vis[MAX], n, k, ans, sum;//地图的输入 void init(){ int i, j; for (i = 0; i < n; i++){ getchar();
2012-08-30 09:31:05
685
原创 poj 1154 LETTERS
#include #include using namespace std;const int MAX = 25;char matrix[MAX][MAX];int r, s, ans;bool vis[30];void init(){ int i, j; for (i = 0; i < r; i++){ getchar();
2012-08-29 16:24:33
666
原创 poj 1606 Jugs
#include #include #include using namespace std;const int MAX = 105;int a, b, n, vis[MAX][MAX], step[MAX*MAX], l, r;string opr[7] = {" ", "fill A", "fill B", "empty A", "empty B", "pour B A", "po
2012-08-29 10:36:02
675
原创 poj 3414 Pots
//和poj1606的题目的解法是一样的,不过有点地方需要注意,这题当没解的时候要输出impossible,还有无论是哪个杯的水的容量符合要求就可以输出了! #include #include #include using namespace std;const int MAX = 110;int a, b, c, r, l, vis[MAX][MAX], step[MAX*MAX];
2012-08-29 10:35:12
1257
1
原创 poj 3210 Coins
/*思路:若n为偶数: 1: 若初始状态为偶数正面 + 偶数反面,要想变成全正或全反,翻转的次数必为偶数。 例如: ○○●●●● 则翻转 2,4,6,8……次均可。 2: 若初始状态为奇数正面 + 奇数反面,要想变成全正或全反,翻转的次数必为奇数。 例如: ○○○○○● 则翻转 1,3(先将●翻为○,再将任一个○翻两下),5,7……次
2012-08-27 15:59:12
736
原创 poj 3278 Catch That Cow
#include #include #include using namespace std;const int MAX = 100001;int n, k, path[MAX];bool vis[MAX];void bfs(){ int tmp; queue q; //队列的初始化 while (q.size() != 0)
2012-08-27 15:20:08
496
原创 poj 1979 Red and Black
//这题属于简单的搜索题,可以分别用bfs和dfs来做! #include #include #include #include using namespace std;const int MAX = 25;char map[MAX][MAX];int i, j, w, h; int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
2012-08-26 10:55:23
635
原创 poj 3974 Palindrome
#include #include const int MAX = 1000005;char str[MAX], Manacher_str[2*MAX];int len, tc = 0, p[2*MAX];using namespace std;void change(){ int i; Manacher_str[0] = '@'; Manacher
2012-08-26 08:47:37
833
原创 Manacher算法:求解最长回文字符串,时间复杂度为O(N)
回文串定义:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。回文子串,顾名思义,即字符串中满足回文性质的子串。经常有一些题目围绕回文子串进行讨论,比如POJ3974最长回文,求最长回文子串的长度。朴素算法是依次以每一个字符为中心向两侧进行扩展,显然这个复杂度是O(N^2)的,关于字符串的题目常用的算法有KMP、后缀数组、AC 自动机,这道题目
2012-08-26 08:44:57
35143
9
原创 poj 3637 Shopaholic
//贪心算法,简单! #include #include #include using namespace std;const int MAX = 20001;int prices[MAX];bool cmp(int a, int b){ return a > b;}int main(){ int i, tc, num, ans; scanf(
2012-08-24 20:52:18
1021
原创 poj 3664 Election Time
#include #include #include using namespace std;struct Info{ int index, fv, sv;}info[50001];bool cmp1(Info a, Info b){ return a.fv > b.fv;}bool cmp2(Info a, Info b){ retur
2012-08-24 18:56:16
867
原创 poj 3619 Speed Reading
#include using namespace std;int main(){ int n, k, s, t, r, i, j, ans, tmp, p; while (cin >> n >> k){ for (i = 0; i < k; i++){ cin >> s >> t >> r;
2012-08-24 16:21:56
839
原创 poj 3750 小孩报数问题
#include #include #include #include using namespace std;int main(){ int num, w, s, i, c; string name, tmp; queue q; queue ans; cin >> num; for (i = 0; i < num; i++){
2012-08-23 22:50:00
1045
原创 poj 3978 Primes
#include using namespace std;const int MAX = 100010;int prime[MAX];int main(){ int i, j, a, b, ans; prime[0] = false, prime[1] = false; for (i = 2; i < MAX; i++) prime[i] =
2012-08-22 18:19:54
712
原创 poj 3979 分数加减法
#include #include #include #include using namespace std;//求最大公约数 int gcd(int n, int m){ int tmp; if (n < m){ tmp = m; m = n; n = tmp; } while (n%m){
2012-08-22 12:54:25
826
原创 poj 3982 序列
#include #include #include using namespace std;string str[1000];int n;string solve(string str1, string str2, string str3){ int i, j, c, nn, len1, len2, len3, num1[100], num2[100], num3[
2012-08-22 09:58:39
627
原创 poj 3126 Prime Path
#include #include #include using namespace std;const int MAX = 100000;//竟然RE了三次,就是因为这里的MAX开小了! int step[MAX];bool prime[MAX];int base[4] = {1, 10, 100, 1000};int main(){ int i, j, tc, nu
2012-08-21 15:48:11
375
原创 poj 3173 Parkside's Triangle
#include using namespace std;const int MAX = 25;int triangle[MAX][MAX];int main(){ int n, s, i, j, k; bool flag = false; cin >> n >> s; for (i = 0; i <= n; i++){ for (j =
2012-08-21 12:05:15
934
原创 poj 3176 Cow Bowling
#include #include using namespace std;const int MAX = 400;short dp[MAX][MAX]; int main(){ int n, i, j; while (cin >> n){ for (i = 1; i <= n; i++){ for (j = 1;
2012-08-20 10:58:54
422
原创 poj 1163 The Triangle
#include #include using namespace std;const int MAX = 110;short dp[MAX][MAX]; int main(){ int n, i, j; while (cin >> n){ for (i = 1; i <= n; i++){ for (j = 1;
2012-08-20 10:49:34
322
原创 poj 1159 Palindrome
//这题的题意主要是要求我们求出给出的字符串和其反过来的字符串的最长公共子序列,//然后再用字符串的长度减去其最长公共子序列的长度就可以得出答案了! #include #include #include using namespace std;short dp[5010][5010]; int main(){ int i, j, len; char str1
2012-08-20 09:52:06
372
原创 poj 1080 Human Gene Functions
/*假设输入的字符串分别为 A,Bf[i][j] = { 从 A[i] 和 B[j] 开始匹配,所能达到的最大值 }假设 A[i] = G,B[j] = C那么现在的情况就是 GxxxxxCxxxxx状态转移为=> f[i + 1][j] + value(A[i], '-')G...-C..=> f[i][j + 1] + value(B[j], '-')-G..C..
2012-08-20 09:05:47
389
原创 最长公共子序列(LCS)的两种求解方法
#include #include using namespace std;const int MAX = 1000;int dp[MAX][MAX];int main(){ char str1[MAX], str2[MAX], LCS[MAX]; int i, j, len1, len2; while (1){ cin.getline(
2012-08-19 09:09:35
942
原创 poj 1836 Alignment
//好不容易才弄明白这题需要求解的答案是什么,之前一直都弄不明白题意!发觉这个博客http://cavenkaka.iteye.com/blog/1542421//分析得不错,就是通过看他的解释,才弄明白题目需要求解的答案! #include #include using namespace std;double height[1010];int lis[1010], lds[101
2012-08-18 23:32:25
342
原创 poj 3671 Dining Cows
//这题我以为是和3670是一模一样的题目,就直接将3670的代码复制过来,点知WA了一次,然后再看看题目//原来这一题只是求最长递增子序列就OK了,呵呵,抵死的WA,谁叫不读题! #include #include #include #include #include using namespace std; const int MAX = 30001; int num
2012-08-18 15:50:21
1125
原创 poj 3670 Eating Together
//最长递增子序列(LIS)和最长递减子序列(LDS)的解法其实是一样的,题目就是要求需要改动的次数最少,所以只要//求出其序列的最长递增子序列和最长递减子序列,通过比较就可以最长的子序列,从而就可以求出改动次数最少答案了! #include #include #include #include #include using namespace std; const int
2012-08-18 11:13:20
652
原创 poj 1631 Bridging signals
//求最长递增子序列,和题目2533、1887、3903等是同一类型的题目!做法差不多! #include #include #include using namespace std;const int MAX = 400010; int single[MAX], tmp[MAX]; int main(){ int tc, i, n, left, right, mi
2012-08-18 10:04:57
332
原创 最长递增子序列(LIS)的三种求解方法
//求最长递增子序列的方法有很多,下面就我接触到的三种方法来写一下实现代码:第一种方法是DP,//第二种是DP+二分查找,第三种是转换为求LCS的方法!而第二种的时间复杂度占优势:O(nlogn)! //第一种方法的DP代码: #include using namespace std;const int MAX = 100000;int dp[MAX];int main(){
2012-08-18 09:36:36
722
原创 poj 1887 Testing the CATCHER
//我都不敢相信,这是World Finals 1994的第二题,就是简单的LIS做法,只不过需要注意的地方确实很多,需要很细心, //而且需要有耐性去读懂题目!这题用二分+DP,0MS过了,数据还是比较弱的了!//求解LIS的两种方法都写了,第一种的效率明显要比第二种的效率要高,第一种时间复杂度为O(n^2),第二种时间复杂度为O(nlgn)! #include #include u
2012-08-17 20:54:20
534
原创 poj 3903 Stock Exchange
//和2533是同一类的题目,都是简单的LIS题目,这题用二分+DP比较好,因为数据比较大!容易超时! #include using namespace std;long num[100001], tmp[100001]; int main(){ int n, i, j, len, left, right, mid; while (cin >> n){
2012-08-17 20:02:09
1090
原创 poj 2533 Longest Ordered Subsequence
//有两种做法:一种是DP,另一种是二分查找! #include using namespace std;int num[1010], dp[1010];int main(){ int n, i, j, ans = 0; cin >> n; for (i = 0; i < n; i++){ cin >> num[i]; } f
2012-08-17 15:21:20
610
原创 poj 2853 Sequence Sum Possibilities
/*其实这个题目就是一个等差数列的问题嘛!连续数,公差为1,可以假设有i个元素的和为给定的num,用for循环依次遍历。然后根据等差数列求和num=i*a1+i*(i-1)*d/2, d即是公差1;可以根据判断a1%i是否为零,判定是否存在i个连续的整数的和为num,而且a1即是该等差数列的首项。如果是的话,则ans++*/#include #include using names
2012-08-16 23:55:53
1050
原创 poj 2140 Herd Sums
#include using namespace std;int main(){ int n, i, j, sum, cnt = 0; cin >> n; //经分析可知,其i的取值不可能大于n/2+1,那样范围就缩小了! for (i = 1; i <= n/2+1; i++){ sum = 0; for (j = i;
2012-08-16 21:24:23
1394
原创 qsort和sort的详解和比较函数的区别
下面先对qsort和sort进行详细的解释,然后再将区别!(需要特别注意的就是qsort和sort的比较函数的写法,很容易出错)First qsort基本快速排序的方法,每次把数组分成两分和中间的一个划分值,而对于有多个重复值的数组来说,基本排序的效率较低。集成在C语言库函数里面的的qsort函数,使用三路划分的方法解决这个问题。所谓三路划分,是指把数组划分成小于划分值,等于划分
2012-08-16 18:17:53
10726
2
原创 poj 1844 Sum
//这题如果仔细一点儿分析,结果就出来了!题意:给出一个数,通过从1到N的连续数的运算而得出这个数//(两个数之间的符号只可以是+或-),求最小的N。 //先通过求从1到N的前N项和,如果是小于这个num数的,肯定满足不了,所以继续相加!如果是可以等于num的情况之下,就得出了结果,可以输出!//如果找不到相加和等于num这个数的,就肯定是大于这个num数的了,就只有通过变换数与数之间的符号
2012-08-16 11:09:12
784
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人