正文内容加载中...
posted @ 2012-05-07 11:50 笑巧 阅读(356) 评论(0) 推荐(0) 编辑
摘要: 题意:给一个整数N(2 ≤ N ≤ 109),求至少可以找到几个素数的相加和为N,并输出各个素数。解题思路:这题用到了有名的哥德巴赫猜想:任一大于5的整数都可写成三个素数之和,任一大于2的偶数都可写成两个素数之和。从这个猜想中可以得到,任何一个整数N(N>=2)最多由三个素数相加构成。要分情况考虑: 1. 如果N为偶数,1)如果N==2,直接输出; 2)如果N>2,那么N一定可以写成两个素数的和; 2.如果N为奇数,1)如果N自身就是素数,则直接输出; 2)如果N由两个素数构成,这两个素数只可能是:2 和 N-2;3)N为三个素数之和。View Code 1#include< 阅读全文
posted @ 2012-05-07 11:28 笑巧 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 解题思路:题目全英的,理解起来有点困难。刚开始我推测着应该是有向图中找一条包含所有顶点的通路,结果还是不对。如果早知道是拓扑排序就好办了。这是数据结构中的经典算法,首先找到入度为0的点,输出并去掉该顶点与其他顶点相连的边,然后依次循环上述操作,直到所有顶点都输出。需要定义一个存放顶点入度的数组(degree),最多100个顶点,所有可以用邻接矩阵存储有向图的结构,如果顶点过多,则应采用邻接表作有向图的存储结构。虽然题目中有不存在的情况,可是根据推断得知必定存在这样的序列。由程序提交结果验证确实如此。不过考虑到该情况也不会出错,就是麻烦些。View Code 1#include<iostr 阅读全文
posted @ 2012-05-05 08:38 笑巧 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 解题思路:题意很明确,关键就是求邮局的位置,由于所有住户坐标到该点的距离和最短,其实就是纵横坐标中位数。即先排序,然后计算中位数的序号。接着就容易求出各个住户到邮局的距离之和即可。View Code 1#include<iostream>2#include<cstdio>3#include<algorithm>4usingnamespacestd;56structpoint{7intx,y;8}p[10005];910intcmp1(pointa,pointb)11{12returna.x<b.x;13}14intcmp2(pointa,pointb) 阅读全文
posted @ 2012-04-21 11:18 笑巧 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 解题思路:这道题就是让求一个整数n除自身外的所有因子之和,然后与 n 相比,如果小于则输出 DEFICIENT,等于则输出 PERFECT;大于则输出 ABUNDANT。本题关键就是注意输出格式,从题意 Format counts: the echoed integers should be right justified within the first 5 spaces of the output line, followed by two blank spaces, followed by the description of the integer. 整数 n输出占 5 空格且向右对齐 阅读全文
posted @ 2012-04-21 08:29 笑巧 阅读(816) 评论(0) 推荐(0) 编辑
摘要: 解题思路:题目虽然很长,其实就是一个约瑟夫环问题,对于输入的字符串,从开始依次进行报数,当报到N=1999时,删除对应的字符,字符串可以看作是首尾相连的环,直到剩余最后一个字符。如果剩余字符为'?',则输出结果:Yes;如果剩余字符为' ',则输出结果:No;否则输出结果:No comments .注意:本题只有一组测试数据,如果写成输入多组的形式,会超时的。View Code 1#include<iostream>2#include<cstdio>3#include<cstring>4usingnamespacestd;5c 阅读全文
posted @ 2012-04-13 11:53 笑巧 阅读(346) 评论(0) 推荐(0) 编辑
摘要: 题意:给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。解题思路:这是最短路问题的变形,以前做的只是求两点之间的最短距离,现在除了距离最短,在此基础上增加了花费最少。用弗洛伊德算法同样可以求解。注意:输入时要考虑重边情况。由于0<n<=1000,0<m<100000,开二维数组也不小,用C++提交超时,把输入输出改用scanf和printf 就AC了。View Code 1#include<iostream>2#include<cstdio>3#in 阅读全文
posted @ 2012-04-13 11:05 笑巧 阅读(809) 评论(0) 推荐(0) 编辑
摘要: 题意:求把总价值分为两个数,使这两个数接近相等,而且这两个数必须由所有设备中的其中几种设备价值构成,并先输出比较大的数,再输出另一个数。解题思路:DP算法,背包问题,求法是先求出总价值sum,再用dp[]求sum/2最多能放多少价值!即可以求出其中一个数了,另一个就是sum-dp[sum/2]了……状态:f[j]:表示软件学院取得容量为j时能获得的最大值,j<=sum/2; 状态转移:f[j]=max{f[j], f[j-v[i]]+v[i]}注意数组的大小(0<n<=50,0<v<=50,0<m<=100)View Code 1#include< 阅读全文
posted @ 2012-04-07 08:39 笑巧 阅读(908) 评论(0) 推荐(0) 编辑
摘要: 解题思路:先排序,之后相邻的肯定是疲劳度最小的。 即: n(a-b)^2+(c-d)^2< (a-c)^2+(b-d)^2dp[i][j]表示 i 个物品取 j 对的最小疲劳数。状态转移方程: dp[i][j]=min{ dp[i-1][j], dp[i-2][j-1]+(w[i]-w[i-1])^2 }View Code 1#include<iostream>2#include<algorithm>3#include<cstdio>4usingnamespacestd;5intw[2010],dp[2010][2010];6intmain()7{8i 阅读全文
posted @ 2012-04-07 08:32 笑巧 阅读(823) 评论(0) 推荐(0) 编辑
摘要: 解题思路:本题考察的是数据结构二叉树那块的知识,题目让求二叉树的先根遍历,可以通过递归简单实现,关键在于如何构建二叉树,这的确实是难点。注意:根据字母表顺序,左子树上的任意结点字母都在根结点前面,而右子树上的任意结点字母都在根结点后面。其中输入数据很独特,首行把二叉树的所有叶子结点列出来组成一个字符串,然后从去掉叶子结点后所形成的新二叉树中再找叶子结点,再组成一个字符串,依次进行下去,直到剩下一个根结点为止。可以把输入数据保存在一个二维字符数组里面,然后建立一个结构体储存二叉树的结点与左右孩子信息。View Code 1#include<iostream>2#include< 阅读全文
posted @ 2012-04-03 09:49 笑巧 阅读(2388) 评论(0) 推荐(0) 编辑