自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ACM 【程式=演算法+資料結構】@蜡笔小轩V

“这么漂亮的女生追求你,你为什么把她拒了?” “妹纸再漂亮,也没有算法漂亮。走了,哥要通宵刷题去了。”

  • 博客(112)
  • 收藏
  • 关注

原创 1211. 商人的宣传

<br />TAG  动态规划  矩阵乘法<br /> <br />题目的意思讲得不是很清楚。起点是不算第一天的,路途不算时间,而且要刚好在第L天到达目的地,不能提前到达。。<br />如果一个矩阵M代表邻接矩阵,M的n次幂 M^n 便是经过n步能到达的路径数。用原始方法时间复杂度为O(n)*O(m^3  )因为我没想到log(n)次的矩阵算法,所以用了动态规划做。O(L*n^2),结果排在Status的第一页 (‖▔ ω▔)<br />转移方程<br />dp[i][j]表示走i步到达j时的路径数<br

2010-07-24 03:56:00 1732

原创 Android入门开发经验

在手机上运行自己写的程序是一件振奋人心的事。之前就对Android印像不错,漂亮的UI,可爱的机器人,并且充满发展的活力,无论是平台本身,还是周边软件。刚好看到身边有同学在搞Android开发,而且本身自己又是读软件工程的,不由得跃跃欲试。期末备考的时候忍不住花了一下午的时间把开发平台搭起来,然后又在当当订了一本Android开发的书。准备考完试便开始尝试Android开发。 万事开头难。所以我把自己的开发过程的经验和笔记整理一下,希望能给有兴趣入门Android开发的人提供一些帮助。

2010-07-23 16:34:00 2890 2

原创 1090. Highways

<br />TAG 最小生成树 Kruskal<br />用Kruskal求最小生成树,最后加入的边的长度就是结果。<br /> <br />证明一下为什么可以这么求。<br />题目要求图要连通,可以有环,且最长边最小。<br />Kruskal保证图是连通无环的,且全部的边的和最小。<br /> <br />题目允许有环,而在进行Kruskal时那些会形成环的边会被丢弃,但其长度小于等于最后加入的边的长度,对结果无影响。并且Kruskal求解的基础就是“用小的边能保证最终生成的边的和最小”(具体证明参见

2010-07-22 16:37:00 1341

原创 1500 Prime Gap

TAG 数论 素数预处理把所有素数求出,用二分法求该数的下标。    0.05s    1916KB不过时间、空间复杂度好像不如延n向两端枚举。。(‖▔ ω▔),跟数据规模有关吧。。这里用了改进的线性筛法,普通的筛法因为一个数有多个约数,会被重复刷掉很多次。void makeprime(){ total=-1; memset(isprime, true, sizeof(isprime) ); for (int i=2; i程序:/*

2010-07-18 21:33:00 1770 2

原创 1137. 河床

<br />TAG 动态规划 地理学家们经常要对一段河流进行测量分析。他们从上游开始向下游方向等距离地选择了n(≤30000)个点测量水位深度。得到一组数据d1,d2,……,dn,回到实验室后数据分析员根据需要对数据进行分析,发掘隐藏在数据背后的规律。最近,乌龙博士发现某种水文现象与河床地势有关,于是他指示他手下的分析员要找出一段河流中最大高低起伏差不超过k(≤100)的最长一段。这看似一个复杂的问题,由于任务紧急,分析员来求助于你,并告诉你博士的所有数据都精确到个位。<br /><br

2010-07-18 04:56:00 2519 4

原创 1298 数制转换

<br />TAG  数制转换<br />原先是想不用普通进制转换,用其他方法做,发现很繁琐。<br />对比一下普通的进制转换与题目的进制转换<br />数字普通3进制 题目的3进制0000 0001001 0002002 01-3010 0104011 0115012 1--6020 1-0<br />ps:csdn居然没有插入表格的功能,还得手写html代码,囧(‖▔ ω▔)<br />发现遇到2就变-,然后先前一位进一。如果n是负数,就把正数结果取反即可。即1和-互换<br />/* source

2010-07-17 23:31:00 1553

原创 1024 Magic Island

<br />TAG 搜索  dfs bfs<br />深度优先、宽度优先都行。<br />因为没有用STL 用静态数组分配节点,速度很不错  0.22 sec 808 KB<br />/* source code of submission 427641, Zhongshan University Online Judge System */#include <stdio.h>#include <memory.h>const int N=10000;struct tnode {

2010-07-17 17:22:00 1491

原创 1052. Candy Sharing Game

<br />TAG 模拟<br />没说N多大。。。水题就直接贴代码了。。<br /> <br />/* source code of submission 427279, Zhongshan University Online Judge System */#include <stdio.h>int n,ans,last;bool equal;int candy[3000];int main(int argc, char *argv[]){ while ( scan

2010-07-16 23:45:00 1396

原创 1022 Poor contestant Prob

<br />TAG 插入排序  二分法<br /> <br />我是用插入排序做的,在插入的时候使用二分法查找位置。用数组idx记录下标,只移动索引,提高速度。<br />/* source code of submission 426993, Zhongshan University Online Judge System */#include <stdio.h>const int N=100000;struct node{ char name[11]; int p

2010-07-16 16:25:00 1601

原创 1119. Factstone Benchmark

<br />TAG 数论<br /> <br />求 max{ n | n! < 2^(2^k) },  其中k=(year-1960)/10+2;<br />阶乘结果会很大,所以两边取对数。log2(n!)=log2(n)*log2(n-1)*......*log2(1)<br />我是直接把所有结果求出来。<br /> <br />ps:<br />求阶乘的对数可以用<br />斯特林公式:<br />log10(n!) = log10(sqrt(2 * pi * n)) + n * log10(n

2010-07-16 14:35:00 1676

原创 1190. Reduced ID Numbers

<br />TAG 暴搜 模除<br /> <br />0.2 sec    1232 KB<br />我不知道第一名那个 0.03 sec 424 KB是怎么办到的。。<br />注意memset那个不必重置整个数组,重置需要那部分就可以。<br />/* source code of submission 426449, Zhongshan University Online Judge System */#include <stdio.h>#include <memo

2010-07-15 22:52:00 1183

原创 1218. 纪念邮票

<br />TAG 数论 <br />与1209. Sequence Sum Possibi 类似,我是用那道题改的。<br />#include <stdio.h>#include <math.h>#include <algorithm>using namespace std;struct node { int a,b;};int T; int n,m;int counter;node ans[1000];bool cmp( const node &x,

2010-07-15 16:57:00 1494

原创 1344. 数列

<br />TAG 进制转换<br /> <br />把N转换成二进制,然后当作K进制数转换为十进制就可以了。<br />#include <stdio.h>int bin[10];int pow[10];int len;int k,N;void tobinary(int n){ len=0; for (int i=0; i<10 && n>0; ++i) { bin[i]=n%2; n/=2; len=i; }}int cal(){

2010-07-15 14:48:00 978

原创 1031. Campus

TAG  最短路 kruskal经典题目,直接用kruskal就行,只是注意要把字符串映射成编号,我用STL的map容器做的。还有节点数最多是200/* source code of submission 424628, Zhongshan University Online Judge System */#include #include #include #include using namespace std;char s1[110],s2[110];int g[200]

2010-07-14 17:52:00 1505

原创 1193. Up the Stairs

<br />TAG 模拟<br /> <br />题目还蛮有意思的。(^ω^)  通常这种题目不会直接模拟的,太繁琐了,肯定经过分析之后有简单的模型。<br />这里的要点就是相遇时传递箱子,两个人的角色也可以互换。<br />互换之后就变成一群人不停来回搬运箱子,同时楼梯只能同时通过一个人的限制也被“打破”了。<br /> <br />这里初始时,有拿箱子和没拿箱子其实就是初始方向不同而已。搬运第一个箱子的时间也就不同了,但后面的周期都一样。<br />这里假设能几个人接连在一起走,当作一个点来看待。比如

2010-07-12 23:16:00 1393

原创 1034. Forest

<br />TAG 数据结构 树 树的深度 宽度<br />虽然是水题,情况没处理好,还wa了几次,囧。<br /> <br />#include <stdio.h>#include <memory.h>const int N=100;bool map[N][N];bool multiedge;bool invalid;int wid[N];int depth,width;int n,m,a,b;bool visited[N];bool indegree[N];

2010-07-11 00:48:00 1148

原创 1209. Sequence Sum Possibi

<br />TAG 数论<br /> <br />简单的数学题。设 n+.. +(n+k)=X, n>0,k>0<br />有 (2n+k)(k+1)=2X<br />         k(k+1)   <2X<br />                k^2<2X<br />                    k<sqrt(2X)<br /> <br />枚举k到sqrt(2X)就行了<br />/* source code of submission 421009, Zhongshan Univ

2010-07-10 22:05:00 1063

原创 1002. Anti-prime Sequences

<br />TAG 搜索 回溯 深度优先<br /> <br />之前看了这题目,毫无头绪,所以搁置了很久,到最近才ac掉。<br /> <br />这种题目,应该是没办法用数学方法推算的,就算有,我想我也推不出。不过1000个数的全排列太大了,用搜索好像又会超时。但仔细分析又发现,条件比较苛刻,all consecutive subsequences of length 2,3,...,d sum to a composite number,也就是说,从2到d的子序列都要满足,不单单d长度的。 /*我

2010-07-10 14:09:00 1879

原创 1010. Zipper

TAG   动态规划 dp 使3个字符串A B Cdp[i][j]表示A的前i个字符和B的前j个字符能否组合成C的前i+j个字符状态转移方程: dp[i][j]=    dp[i-1][j] && C[i+j-1]==A[i-1]    ||      dp[i][j-1] && C[i+j-1]==B[j-1];  //注意边界/* source code of submission 419888, Zhongshan University Online Judge System */#include

2010-07-10 00:53:00 1710 3

原创 1889. Max’s game

<br />TAG  种子染色  flood fill 队列 数据结构<br /> <br />使用类似种子染色的方法,从起点开始染色,使用队列保证花费小的先染到。<br />//1.07 sec 1476 KB 2839 Bytes#include <stdio.h>#include <queue>#include <memory.h> using namespace std;const int DY[]={0, 1, 0, -1};const int DX[]={-

2010-07-07 09:22:00 1148

原创 1888. Circular Sequence

TAG  贪心算法设数组sum记录序列和,要找一个最大的子序列,只需找出 asc=max { sum[b]-sum[a] }   0当然,还有一个问题要处理,序列接成一个圈。上面只求出一种情况,还有一种情况就是中间被舍弃,把首尾两段连接成子序列。我们只要仿照上面的方法,再求一个最小的子序列desc=min { sum[b]-sum[a] },然后用sum[n]减去desc便能得到asc。但这里注意desc的长度为1-n,总长度减去desc后的长度为 0-(n-1)。我们要去掉0的情况,补上n的情况。但具体的

2010-07-04 02:21:00 1405 1

原创 HDU 1074 Doing Homework

<br />动态规划,先算只做一个homework的罚分,接着算2个、3个。。网上找来找去只有一份代码,被copy来copy去,所以我把自己的代码贴上来。<br /><br />这个是HDU的acm课件里面的截图。有点像数塔。不过状态不好保存。<br /> <br /> <br />//46MS 1112K 1791B G++ //使用状态压缩,如01001(二进制)表示做了第一个和第四个作业。#include <stdio.h>#include <string.h>struct dp_

2010-06-18 00:20:00 2211

原创 Sicily 1800. Sequence

题意很简单,但是数据规模比较大。第一步的优化就是使用sum数组,sum[i]表示1到i的和。能快速计算其中连续一段数据之和。显然主要的操作就是对于sum[j] (j>=L),寻找最大的sum[i] ( max(0,j-U)虽然很符合RMQ算法,可是我用RMQ还是超时了。。 最后用一个priority_queue解决的。优先级队列满足我们求极值的要求。实现时,我们只需从头扫描队列

2010-04-10 01:57:00 1514 2

原创 Sicily 1798. Alice and Bob

判断n*n是否为偶数就行。简单的证明可以用1*2的骨牌布满棋盘。对方每走一步,你走1*2骨牌剩下的另一格,能保证必胜。/* source code of submission 312719, Zhongshan University Online Judge System */#includeusing namespace std;int main(){ in

2010-04-10 01:35:00 3490 4

原创 Sicily 1797. Do solve it directly

题目很长,废话很多。其实题目很简单,按题目说的做就行。直接按照公式递归做。/* source code of submission 312639, Zhongshan University Online Judge System */#includeusing namespace std;int n,a,b;int x,y,d;void go(){

2010-04-10 01:31:00 1043

原创 Sicily 1796. Max's kingdom

找中位数。先进行多关键字排序,然后再从头扫面一遍,统计结果。/* source code of submission 312635, Zhongshan University Online Judge System */#include#includeusing namespace std;struct node{ int p,a; bool o

2010-04-10 01:20:00 1096

原创 Sicily 1799. Slides

显然直接开个大数组模拟最简单,可是slide的坐标范围太大,但是slide的个数却不多, 用离散化的方法,先对坐标排序,然后重新标号。/* source code of submission 339198, Zhongshan University Online Judge System */#include#include#include#include#include

2010-04-10 01:16:00 1076

原创 Sicily 1794. Missiles

A国有n个城市,B国有m个城市,(n>=m),给出每对城市间导弹的飞行时间,求A全歼B至少需要多少时间。显然,AB可以形成一个二分图,题目求在所有最大匹配中,最大边最小能取多少。 求最大匹配用匈牙利算法。但为了求最大边的最小值,我们可以在边的取值范围内进行二分搜索,依次调用匈牙利算法,检查是否能形成m对匹配。需要注意的是,数据给出的城市间导弹飞行时间不一定是最短的。需要对所有顶点用

2010-03-26 17:50:00 1139

原创 Sicily 1793. Numbers

设x=GCD(a,b),y=LCM(a,b)。a=x*k1b=x*k2, 其中 GCD(k1,k2)=1有y=x*k1*k2; 求min(a,b),即min(k1,k2)有k1和k2两个未知数,数据规模也不是特别大,可以用搜索求解。因为只需找到min(k1,k2),我们从k1,k2最接近时开始搜索,只要找到符合条件的解便能保证最优,所以搜索量还是很小的。 #includ

2010-03-25 01:35:00 1455 1

原创 Sicily 1792. Hengheng's Problem

模拟题,先按时间段的先后排序,然后从头扫描一边寻找最大连续空闲时间段。注意不要遗漏最后边界情况。 #include#include#includeusing namespace std;struct T{ //s为开始时间,t为结束时间 int s,t;};bool cmp(const T &a, const T &b){

2010-03-25 01:15:00 1474

原创 Sicily 1791. Philia's Problem

用模拟的方法算很繁琐,而且很容易出错。其实可以用蔡勒公式,快速求某一天是星期几。#includeint days[12]={31,28,31,30,31,30,31,31,30,31,30,31};bool isLeapYear(int y){ return ( (y%100!=0)&&(y%4==0) ) || (y%400==0);}/

2010-03-25 00:53:00 1376

原创 Sicily 1790. Single Round Match

 水题。数据比较大,显然得用高精度。#include #includeusing namespace std;int main(){ int t; char a[1004], b[1004]; scanf("%d", &t); for (int i=0; i<t; ++i) { scanf("%s%s",a

2010-03-25 00:35:00 1208

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除