ACM题集
文章平均质量分 55
淡墨写江山
勤有功戏无益
展开
-
HDOJ2050(折角划分平面)
首先,先推理直线划分面的情况。 当直线数目为0时,平面数目为1 当直线数目为1时,平面数目为2 依次类推,可得 可以发现,这是一个数列。 f[n]=f[n-1]+n; 但是,这只是直线的,而题目要求是折角的,变化如下: 平面数减少了2! 下附AC代码: /*HDOJ1005 作者:陈佳润 2013-04-09 */ #include using names原创 2013-04-09 16:31:08 · 611 阅读 · 0 评论 -
HDOJ 1106 排序 (字符串处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1106 简单的字符串处理,注意以下数据即可 555500000 0000055555 0055550000 下面提供两种做法: 1.利用C语言库函数strtok(将函数按字符串分割)和atoi(将字符串转成int) /*HDOJ1106 作者:陈佳润 2013-04-18 */原创 2013-04-18 00:11:47 · 1181 阅读 · 0 评论 -
HDOJ 1114 Piggy-Bank (多重背包)
恰好装满的多重背包 初始化时,将dp都初始化成无穷大,而dp[0]=0;即可 /*HDOJ1114 作者:陈佳润 2013-04-18 */ #include using namespace std; #define min(a,b) (a>b?b:a) #define INF 0x3f3f3f3f int dp[10005]; int Weight; int n; void M原创 2013-04-18 12:56:46 · 696 阅读 · 0 评论 -
HDOJ 1248 寒冰王座 (多重背包)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1248 标准的多重背包,直接附代码: /*HDOJ1248 作者:陈佳润 2013-04-18 */ #include #include using namespace std; #define max(a,b) (a>b?a:b) int dp[10005]; int momey原创 2013-04-18 16:43:39 · 813 阅读 · 0 评论 -
HDOJ 1284 钱币兑换问题 (求多重背包恰好装满总方案数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1284 把问题抽象成多重背包的问题,即 有三种商品, 第一种价值1,体积为1 第二种价值2,体积为2 第三种价值3,体积为3 背包容量为n 求背包恰好装满的方案数(因为所有物品的价值/体积都是1,所以肯定是装满,所以转化成普通多重背包最优方案数) 状态转移方程为 dp[i]=max原创 2013-04-18 22:50:57 · 1816 阅读 · 0 评论 -
HDOJ 2159 FATE (二维多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 二维多重背包,用dp[i][j]表示经验值,i表示最多能杀多少只怪,j表示忍耐度,dp[i][j]表示当最多能杀i只怪,且最大忍耐度为j时能取得的最大经验值。 最后,只需在dp[s][]这一行里寻找经验值大于n的最小m值,即可。 /*HDOJ2159 作者:陈佳润 20原创 2013-04-18 21:39:05 · 725 阅读 · 0 评论 -
HDOJ 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 多重背包,转化成0/1背包来做,不过转化成1个1个效率很低,可以按1 2 4 8 16....这样的数列来分,根据二进制的原理,这样可以表示任何数 例如 13可以表示成 1 +4 +8 AC代码: /*HDOj2191 作者:陈佳润 2013-04-18 */ #原创 2013-04-18 23:19:53 · 768 阅读 · 0 评论 -
HDOJ 1712 ACboy needs your help(分组0/1背包)
把同一门考试当成一组,在一门考试里,花的天数和考的成绩分别是组内物品的代价和价值,这样就转化成一个分组的0/1背包的问题。 AC程序: /*HDOJ1712 作者:陈佳润 2013-04-19 */ #include using namespace std; #include #define max(a,b) (a>b?a:b) int groud[105]; int dp[105原创 2013-04-19 12:07:26 · 768 阅读 · 0 评论 -
HDOJ 2955 Robberies (0/1背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 因为被抓的概率是实数,而背包问题中,用于做下标的必须是整数,所以此处用所有银行的总金额做下标,将逃脱率(1-pj)作为dp的值 初始化的时候,dp[0]=1(不抢的逃脱率为1);其它都为0,按照0/1背包来做即可。 AC代码: /*HDOJ2955 作者:陈佳润 20原创 2013-04-19 20:10:50 · 717 阅读 · 0 评论 -
HDOj 2094 产生冠军(拓扑排序)
只需统计无没有前驱结点的结点个数即可,如果是环,是0个,如果有不确定的,那么肯定>1 利用STL里的map,string,set容器可以简洁地实现 代码如下: #include #include #include #include using namespace std; mapG; setSet; set::iterator p; int main(){ int n,原创 2013-04-25 00:34:50 · 981 阅读 · 0 评论 -
HDOJ2035(快速幂取模)
典型的快速幂取模 /*HDOJ1108 作者:陈佳润 2013-04-07 */ #include using namespace std; __int64 exp_mod(__int64 a, __int64 n, __int64 b) { __int64 t; if(n==0) return 1%b; if(n==1) return a%b; t=原创 2013-04-07 23:27:50 · 511 阅读 · 0 评论 -
HDOJ1163(数根定理)
首先,推导一个定理 将一个二位数表示成ab,对另一个表示为cd,两者可以相等,也可以不等,a、c表示十位,b、d表示个位 那么 ab*cd=(a*10+b)*(c*10+d)=a*c*100+a*d*10+b*c*10+b*d 则 有 ab*cd=(a+b)*(c+d) 同理可证多位数。 从上面的推导,我们可以知道: N个数相乘后的根=N个数的根相乘后该数的根 然后,再谈谈我原创 2013-04-08 00:06:28 · 560 阅读 · 0 评论 -
HDOJ2046(动态规划)
只有两种情况 1.从后面竖着放一个,问题转化成n-1规模的 2.从后面横着放两个,问题转化成n-2规模的 状态转移方程为 dp[i]=dp[i-1]+dp[i-2]; /*HDOJ1163 作者:陈佳润 2013-04-08 */ #include using namespace std; __int64 num[55]; int main(){ int i,n; num[1原创 2013-04-08 00:41:12 · 591 阅读 · 0 评论 -
HDOJ2018(简单规律)
类似斐波那契数列 规律:num[i]=num[i-1]+num[i-3]; /*HDOJ1163 作者:陈佳润 2013-04-08 */ #include using namespace std; int main(){ long num[56],i,n; num[1]=1;num[2]=2;num[3]=3;num[4]=4; for(i=5;i<55;i++) num[i]原创 2013-04-08 00:54:46 · 486 阅读 · 0 评论 -
HDOJ1008(简单计数)
水题,直接贴代码 /*HDOJ1008 作者:陈佳润 2013-04-08 */ #include using namespace std; int main(){ int a,b,sum,i,n; while(cin>>n&&n){ b=0; sum=0; for(i=1;i<=n;i++) {原创 2013-04-08 21:21:53 · 563 阅读 · 0 评论 -
HDOJ2045(组合数学)
典型的环形染色问题 当染第n个的时候,如果第一个和第n-1个是颜色不同的,那么问题前面的n-1个即是规模为n-1的子问题,而第n个只有一种颜色可选(3-2) 当第1个和第n-1个相同颜色的时候,第n个有2种颜色可以选,而因为第n-2个,颜色与第1个不同,所以转化成规模为n-2的子问题 所以,可以推倒出: f(n)=f(n-1)+2*f(n-2); /*HDOJ2045 作者原创 2013-04-08 22:10:08 · 541 阅读 · 0 评论 -
HDOJ2546 饭卡(0/1背包)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2546 根据题目,当只剩下5元的时候,肯定选择最贵的菜。 所以,直接用5元买最贵的菜,剩下的钱没有限制,所以直接用0/1背包解就可以了 /*HDOJ2546 作者:陈佳润 2013-04-17 */ #include #include using namespace std;原创 2013-04-17 21:18:21 · 740 阅读 · 0 评论 -
HDOJ1285 确定比赛名次(拓扑排序)
标准的拓扑排序,用邻接表来存储 邻接表的下标表示节点序号,邻接表内容包括两个部分,一个是该节点的前驱数目,一个是后继链表(存放其所有后继的链表)。 /*HDOJ1285 作者:陈佳润 2013-04-17 */ #include using namespace std; typedef struct tag_node{//邻接表的边域节点 int data; struct t原创 2013-04-17 16:33:46 · 686 阅读 · 0 评论 -
HDOJ1465(错排)
标准的错排,推倒过程参考: http://blog.csdn.net/u010021900/article/details/8775523 /*HDOJ1465 作者:陈佳润 2013-04-08 */ #include using namespace std; int c(int n,int k){ int i,sum=1,kk; kk=2; for(i=1;i<=k;i++原创 2013-04-09 00:51:42 · 450 阅读 · 0 评论 -
HDOJ1061(快速幂取模)
典型的快速幂取模 /*HDOJ1061 作者:陈佳润 2013-04-08 */ #include using namespace std; __int64 exp_mod(__int64 a, __int64 n, __int64 b) { __int64 t; if(n==0) return 1%b; if(n==1) return a%b; t=e原创 2013-04-08 23:53:17 · 547 阅读 · 0 评论 -
HDOJ2049(错排)
N对新婚夫妇,M对找错,其实就是现在N里面选出M,也就是C(N,M),然后考虑M对夫妇,全都选不到自己的配偶的情况(错排): M[i]=(n-1)(M[i-1]+M[i-2]) 推理如下: 假设A B C D 四个人 假设A先选错,那他有3种选择(即n-1种) A B C D * A * * 如果B也选择了A,那么问题转化成 n-2规模的 如果B不选择A,那么转化成n-1原创 2013-04-09 00:45:07 · 1096 阅读 · 0 评论 -
HDOJ 1811 Rank of Tetris (拓扑排序+并查集)
超级传送门 首先,列举几种常见的Wrong Answer的数据 第一种 2 5 0 > 1 1 0 = 1 0 =1 1 = 0 第二种 3 3 0 = 1 1 > 2 2 第三种 5 0 第三种数据应该是uncertain 如果是排名是相同的人,用并查集合并 然后再检测是否有环即可。 下附AC代码: /*HDOJ 1811 作者:陈佳润 201原创 2013-04-29 19:49:59 · 734 阅读 · 0 评论 -
HDOJ1021(找规律)
模拟几次,就能发现,其实是有规律的 1 7 2 11 3 18 4 29 5 47 6 76 ..... 会发现,从2开始,每隔4个数,就能被3整除 /*HDOJ1061 作者:陈佳润 2013-04-08 */ #include using namespace std; int main() { int n; while(cin>>n){ if(n=原创 2013-04-09 00:07:17 · 568 阅读 · 0 评论 -
2012蓝桥杯省赛第四题 奇怪的比赛(暴力解决)
奇怪的比赛 某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。 每位选手都有一个起步的分数为10分。 某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目原创 2013-04-30 01:38:29 · 1745 阅读 · 0 评论 -
2012蓝桥杯省赛第五题 转方阵(矩阵倒置)
对一个方阵转置,就是把原来的行号变列号,原来的列号变行号 例如,如下的方阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 转置后变为: 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 但,如果是对该方阵顺时针旋转(不是转置),却是如下结果: 13 9原创 2013-04-30 10:31:41 · 2351 阅读 · 0 评论 -
HDOJ2188 哈密顿绕行世界问题(DFS)
标准的DFS,用STL里的stack可简便地完成。 /*HDOJ2188 作者:陈佳润 2013-04-12 */ #include #include using namespace std; int Case; stack S; int map[22][5];//记录数据 int used[22];//标记是否走过 int start;//记录起点 void DFS(){ int top原创 2013-04-12 01:07:51 · 689 阅读 · 0 评论 -
HDOJ2614 Beat(DFS)
标准的DFS,用map[][]来记录分数,用used[]来标志是否访问过。 /*HDOJ2614 作者:陈佳润 2013-04-12 */ #include using namespace std; int n; int map[17][17]; bool used[17]; int result; void DFS(int row,int score,int all){ int i原创 2013-04-13 00:27:37 · 652 阅读 · 0 评论 -
HDOJ1010 Tempter of the Bone(DFS)
简单的DFS问题,网上说不用奇偶剪枝会超时,其实不然,下附一份不进行剪枝的AC代码: /*HDOJ1010 作者:陈佳润 2013-04-13 */ #include using namespace std; char map[9][9];//保存地图原貌 int n,m,T; bool used[9][9];//标记是否可以访问 bool flag;//标记是否找到了成功的路径 void D原创 2013-04-13 18:32:52 · 561 阅读 · 0 评论 -
HDOJ4500 小Q系列故事——屌丝的逆袭(简单模拟) &&腾讯2013编程马拉松第0场第一题
/*HDOJ4500 && 腾讯2013编程马拉松第0场第一题 作者:陈佳润 2013-04-14 */ #include using namespace std; int map[22][22]; int score[22][22]; int main(){ int n,m,i,j,max,mi,mj; //freopen("1.txt","r",stdin); while(s原创 2013-04-15 08:31:49 · 797 阅读 · 0 评论 -
HDOJ4502 吉哥系列故事——临时工计划(动态规划)&& 腾讯2013编程马拉松第0场第三题
先读取,筛选出符合条件的工作(如超过了规定时长的去掉) 建立二维数组dp[][],dp[i][j]表示第i天到第j天的最大收益 显然,可以得到一条状态转移方程 对于一个工作,时间为a到b,它的收益是w,那么有: dp[i][j]=max(dp[i][j],dp[i][a-1]+dp[b+1][j]+w); /*HDOJ4502 && 腾讯2013编程马拉松第0场第三题 作原创 2013-04-15 08:38:27 · 798 阅读 · 0 评论 -
HDOJ4505 小Q系列故事——电梯里的爱情(简单模拟) && 腾讯2013编程马拉松第1场第一题
简单的模拟题,跟HDOJ1008有点像,不过比它简单 /*HDOJ4505 && 腾讯2013编程马拉松第1场第一题 作者:陈佳润 2013-04-14 */ #include using namespace std; #include int main() { int q[105],Time,i,a,sum,n,max; cin>>Time; while(Time原创 2013-04-15 08:41:19 · 993 阅读 · 0 评论 -
HDOJ4525 威威猫系列故事——吃鸡腿 (数论) && 腾讯2013编程马拉松第5场第一题
这个题目需要化简,其实就是每一次的和乘上(k1+k2): a1*k1+a1*k2+a2*k1+a2*k2.....=sum*(k1+k2); 注意要考虑,当k1+k2是发散的,才有可能达到k,如果是收敛的,那么只会越来越小。 所以k1+k2>1或者k1+k2 注意特殊情况,一开始就达到了K /*HDOJ4525 && 腾讯2013编程马拉松第5场第一题 作者:陈佳润 20原创 2013-04-15 08:49:14 · 682 阅读 · 0 评论 -
HDOJ4501 小明系列故事——买年货(三维多重背包变形)&& 腾讯2013编程马拉松第0场第二题
多维动态规划,背包变形,题目代码比较简单,讲解写在代码注释里 /*HDOJ4501 && 腾讯2013编程马拉松第0场第二题 作者:陈佳润 2013-04-15 */ #include using namespace std; int V1,V2,K; int dp[101][101][6]; int max(int a,int b){ if(a>b) return a; re原创 2013-04-15 09:53:45 · 1125 阅读 · 0 评论 -
HDOJ1005(找循环节点)
首先,对于网上那些直接说循环点是48的,表示质疑。 因为 (x+y)%7=(x%7+y%7)%7 所以 f[n-1]和f(n-2)的取值范围都是{0,1,2,3,4,5,6} 所以一共49种,由于从0开始,所以是小于等于48, 还要考虑特殊情况,因为对f[n]有影响的还有A和B 当A和B都是7的倍数的时候,则序列为1 1 0 0 0 0 0..... 否则,序列则会按照某个循环原创 2013-04-09 15:32:39 · 601 阅读 · 0 评论 -
HDOJ 1874 畅通工程续(最短路)
超级传送门 注意三个问题: 1.无向图 2.有重边,应该选最小那条 3.如果查询的是A地点到本身,则返回0 Floyd解法: /*HDOJ2544 作者:陈佳润 2013-04-09 */ #include #include #define min(a,b) (a>b?b:a) long int map[205][205],n; void Floyd(){//Floy原创 2013-04-09 20:55:46 · 510 阅读 · 1 评论 -
HDOJ 2019 数列有序!(排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2019 水题,排下序而已。 AC代码: /*HODJ2019 作者:陈佳润 2013-04-26 */ #include #include using namespace std; int cmp(const void *a,const void *b){ return原创 2013-04-26 00:21:48 · 689 阅读 · 0 评论 -
HDOJ 2048 神、上帝以及老天爷(错排)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2048 标准错排,直接给程序: /*HODJ2019 作者:陈佳润 2013-04-26 */ #include using namespace std; __int64 A(int n){ int i; __int64 sum=1; for(i=1;i<=n;i++) sum*=i原创 2013-04-26 00:32:17 · 815 阅读 · 0 评论 -
HDOJ 2020 绝对值排序(简单排序)
水~ /*HODJ2019 作者:陈佳润 2013-04-26 */ #include #include using namespace std; #include int cmp(const void *a,const void *b){ return abs(*(int *)b)-abs(*(int *)a); } int main(){ int num[105],n,i; whi原创 2013-04-26 00:38:33 · 622 阅读 · 0 评论 -
HDOJ 2041 超级楼梯(递推)
递推式为: dp[i]=dp[i-1]+dp[i-2]; AC代码: /*HODJ2019 作者:陈佳润 2013-04-26 */ #include using namespace std; int dp[43]; int main(){ int i,n,Time; dp[2]=1; dp[3]=2; for(i=4;i<=40;i++) dp[i]=dp[i-1]+d原创 2013-04-26 00:48:36 · 766 阅读 · 0 评论 -
HDOJ 2647 Reward(分层拓扑排序)
超级传送门 分层的拓扑排序,先判断是否有环,然后再逆过来求拓扑排序,即设置两张邻接表,一张存前驱,一张存后继,判断有环没还用前驱表,判断至少要多少工资用后继表。 算法写得不好,C++能过(约500MS),但是GNU C++超时了,目前不知道原因,求大神指教。 下附代码: /*HDOJ2647 作者:陈佳润 2013-04-26 */ #include #include using na原创 2013-04-26 10:20:25 · 847 阅读 · 0 评论