普通算法
famousDT
掌握C/C
展开
-
SOJ-1950(cards)
【题目描述】一堆牌n张,每次可以去走1,2,3张,有多少种取法【解题思路】x[0] = 1;x[1] = 1;x[2] = 2;x[i] = x[i - 1] + x[i - 2] + x[i - 3]原创 2012-08-20 09:59:39 · 275 阅读 · 0 评论 -
POJ-3210(翻转硬币必须k次使其同面)(Coins)
【题目描述】桌子上有N枚硬币,翻转X次(必须是N次,不能多也不能少)。同一硬币可以翻多次。使得不论原始状态如何,翻完后硬币是同一面朝上。【解题思路】当N为偶数时无解,当N为奇数时结果为N-1.由于解法简单,就不贴代码了~分析:1. 若N为偶数。两种硬币的组合可能是(奇数+奇数)或者(偶数+偶数)。当正面硬币数目和反面硬币数目均为偶数时,想要同一面朝上,翻转次数必为偶数。原创 2012-04-13 14:03:06 · 1254 阅读 · 0 评论 -
POJ-3480(【博弈】取石子游戏)(John)
【题目描述】有n堆石子,每堆个数不一样,每次必须取至少1个,最多把一堆取完。最后取完的输,问John是先手,问是否会赢?【解题思路】把所有结果异或,如果不是0就赢,否则输.对所有都是1的情况特殊考虑int main(){ int n; int cases; cin>>cases; while (cases--) { cin>>n; int i, x, ans原创 2012-04-13 13:50:00 · 793 阅读 · 0 评论 -
POJ-3364(简单组合)(Black and white painting )
【题目描述】a*b的棋盘,最下角*可能是白色或黑色;问:里面包好多少个8*8的棋盘,这个棋盘最下角必须是白色【解题思路】拿16*16的比划一下就知道了,很简单int main(){ int a, b, c; while (cin>>a>>b>>c, (a || b || c)) { a -= 7; b -= 7; if ((a & 1) && (b & 1))原创 2012-04-13 12:38:03 · 681 阅读 · 0 评论 -
POJ-2526(判断一堆点是否有个中间点)
排序,然后看看第一个节点和最后有一个节点,第二个节点和倒数第二个节点……的中点是否完全一样即可原创 2012-04-13 10:59:39 · 603 阅读 · 0 评论 -
POJ-2199(一元n次方程,二分答案)(Rate of Return )
/*==========================================================*\| 二分搜索答案\*==========================================================*/int main(){ int n; int cases = 1; while (cin>>n, n != -1) {原创 2012-04-13 10:15:25 · 1001 阅读 · 0 评论 -
POJ-2833(第k小的数变形)
【题目描述】一个数组5000000,去掉n1个最大的,n2个最小的,n1+n2【解题思路】方案1:运用快排中第k小的数分别求出两个分界点,再从总数中减去即可,但是有内存限制,不能开这么大的数组,WA了无数次以后MLE了方案2:用两个数组分别存放最大的n1个数和最小的n2个数,不断更新,然后从总数中减去这两个数组中的内容即可int main(){ ll n1, n2, n;原创 2012-04-24 21:48:51 · 808 阅读 · 0 评论 -
SRM540-div2-500(边界没处理好)
被系统弄挂了,问题出在最大值没处理好。Problem Statement This problem statement contains superscripts and/or subscripts. It may not display properly outside the applet.Little Rudolph had an important原创 2012-04-11 22:53:27 · 483 阅读 · 0 评论 -
POJ-2495(棋盘覆盖问题)
【题目描述】8*8的棋盘被扣掉两个,问还能用2*1的瓷砖完全覆盖不?【解题思路】就是把棋盘染色成国际象棋黑白相间的棋盘,如果两个格子同色则不可,否则可以。if (((a + b) & 1) == ((c + d) & 1))同奇偶,不行原创 2012-04-11 22:55:03 · 862 阅读 · 0 评论 -
POJ-2042(最多四个数的平方和多少种方法)(Lagrange's Four-Square Theorem )
AC的方法:int d[400000];int ans[4000000];int main(){ int i, j, k, l; for (i = 1; i <= 181; ++i) { d[i] = i * i; ans[d[i]]++; } for (i = 1; i <= 181; ++i) { for (j = i; j <= 181 && d[i] + d[原创 2012-04-11 14:52:06 · 1468 阅读 · 0 评论 -
【YES】SOJ-2906、2431(归并排序求逆序数)
/****************************************************************************************************** ** Copyright (C) 2011.06.12(8:000)-2013.07.01 ** Author: famousDT ** Edit date: 2011-06-12*原创 2011-10-17 16:14:35 · 588 阅读 · 0 评论 -
POJ-3233+3070(矩阵加、乘、乘方)()
题意:已知一个n*n的矩阵A,和一个正整数k,求S = A + A2 + A3 + … + Ak。思路:矩阵快速幂。首先我们知道 A^x 可以用矩阵快速幂求出来(具体可见poj 3070)。其次可以对k进行二分,每次将规模减半,分k为奇偶两种情况,如当k = 6和k = 7时有: k = 6 有: S(6) = (1 + A^3) * (A + A^2 + A^3) = (1原创 2012-03-20 20:58:39 · 533 阅读 · 0 评论 -
POJ-3273(另类二分)
【题目描述】给出农夫在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值【解题思路】一开始二分的上界为n天花费的总和(相当于分成1份),下界为每天花费的最大值(相当于分成n份),然后二分,每次的mid值为(上界 + 下界)/ 2,然后根据mid值遍历n天花费,对n天的花费进行累加,每当超过mid值 份数+原创 2012-03-20 18:43:30 · 832 阅读 · 0 评论 -
POJ-2661(不断优化)
/*==========================================================*\| 求2^k>=n!,两边同时log10,打表简化\*==========================================================*/int main(){ int i, j, k; ll y = 2; int d[50原创 2012-04-06 10:01:22 · 653 阅读 · 0 评论 -
POJ-2704(化搜索为简答记忆)(Pascal's Travels )
ll d[100][100];ll ans[100][100];int main(){ ll n; while (cin>>n, n != -1) { getchar(); ll i, j; for (i = 1; i <= n; ++i) { for (j = 1; j <= n; ++j) { char c; scanf("%c", &c);原创 2012-04-05 17:05:36 · 426 阅读 · 0 评论 -
POJ-2680(简单递推)(Computer Transformation )
【题目描述】从1开始,1->01,0->10问第n步以后有多少对0【解题思路】要产生一对'00',只能由'01'产生,而‘01’可由'1'或‘00’产生,所以f[i] = f[i-2]的‘1’的个数 + f[i-2]的’00‘的对数先简单列几个0 1 1 3 5 11 21//0的对数1 2 4 8 //1的个数第一个数是0,如果n被2整除2*前面+1,否则2*前面原创 2012-04-05 16:40:51 · 557 阅读 · 0 评论 -
POJ-2507(另类变态二分法)
二分求未知数int main(){ double x, y, c; while (cin>>x>>y>>c) { double low = 0.0; double high = y; double mid; while (low <= high) { mid = (low + high) / 2; double test = c * (sqrt(x * x -原创 2012-03-15 17:36:48 · 44867 阅读 · 0 评论 -
POJ-3370(鸽巢原理)
所谓鸽巢原理,即n+1只鸽子,只有n个巢,则至少有一鸽巢有两只鸽子。鸽巢原理理解起来并不困难,有些题目需要转换一下。 题意:有n个数,可能相同也可能不相同,从中取出一些数,使它们的和能被c整除(c 解:构造序列si,使得 s1 = a1 s2 = a1 + a2 s3 =原创 2012-04-30 10:33:03 · 707 阅读 · 0 评论 -
POJ-3761(组合问题)(Bubble Sort )
题目大意:众所周知冒泡排序算法多数情况下不能只扫描一遍就结束排序,而是要扫描好几遍。现在你的任务是求1~N的排列中,需要扫描K遍才能排好序的数列的个数模20100713。注意,不同于真正的冒泡排序算法,只要数列有序就立刻停止,而不用再检验一遍。估计多数人都是找规律吧,先看出递推,然后求出通项……这个题只有找出通项公式才能通过,所以首先公布答案:K!((K + 1) ^ (N原创 2012-04-30 11:17:59 · 522 阅读 · 0 评论 -
【组合】C(n,k)的奇偶性
(n & k) == k 结果是奇数否则,结果为偶数原创 2012-08-01 16:54:19 · 1872 阅读 · 0 评论 -
SOJ-3305(斯德哥尔摩数)
【题目描述】求第k个二进制表示1的个数为偶数的数【解题思路】要么是2 * k要么是2 * k + 1原创 2012-07-23 17:32:12 · 535 阅读 · 0 评论 -
【SOJ-1865整数划分】优化
#define N 501ll d[N][N];ll q(ll n, ll m){ if ((n < 1) || (m < 1)) return 0; if (n == 1 || m == 1) return 1; if (n < m) return q(n, n); if (n == m) return q(n, m - 1) + 1; return原创 2012-08-02 10:40:52 · 823 阅读 · 0 评论 -
SOJ-3450(一个数的约数有哪些,需要列举)
【解析】分成两段int main(){ int n; while (scanf("%d", &n) == 1) { int i, end = sqrt(n * 1.0) + 1; int ans[10005], index = 0; int flag = -1; for (i = 1; i <= end; ++i) { if (n % i == 0) { p原创 2012-07-10 17:02:25 · 624 阅读 · 0 评论 -
SOJ-3601(Cola)
【题目描述】5瓶可乐换一瓶,一共喝n瓶,至少要多少钱【解题思路】n - (n - 1) / 5原创 2012-05-17 09:24:32 · 357 阅读 · 0 评论 -
SOJ-1748(求约数个数)
int i, j; for (i = 1; i <= 1000; ++i) { d[i * i]++; for (j = i + 1; j * i <= 1000000; ++j) d[i * j] += 2; }原创 2012-06-04 11:55:41 · 488 阅读 · 0 评论 -
POJ-3844(余数相同)()
【题目描述】给一组序列和除数d,求连续子序列的和能整除d的个数。int f[1000005];int main (){ int t; scanf("%d", &t); while (t--) { memset(f, 0, sizeof(f)); int d, n; scanf("%d%d", &d, &n); int sum[50005] = {0}, ans原创 2012-05-13 13:51:33 · 585 阅读 · 0 评论 -
SOJ-2956(腾讯笔试题-猜数字)(寻找临界楼层)
int main(){ int t, i; cin>>t; while (t--) { int x; cin>>x; int times = 1, steps = 0; while (x >= times) { x -= times; ++steps; ++times; } if (x) ++steps; printf("%d\n", step原创 2012-04-23 15:55:14 · 646 阅读 · 0 评论 -
POJ-2050(文本查询经典例子,代码很长很长)(Searching the Web )
#define MAX_LINES 2048#define MAX_LINE_LEN 128#define MAX_DOCS 128#define MAX_WORDS 65536#define MAX_WORDS_PER_LINE 128struct node { int doc, line; struct node *next;};char lines[MAX_LI原创 2012-05-06 14:35:12 · 1003 阅读 · 0 评论 -
POJ-2531(随机化 or dfs)(Network Saboteur )
【题目描述】将一个图的所有节点分入两个子集,使横跨这两个子集的边的和最大值。【解题思路】随机改变一个点的位置,算出权和,重复200000次,取最大值输出。int part[31], my_map[31][31];int n;int main(){ while (scanf("%d", &n) == 1) { int i, j; for (i = 1; i <=原创 2012-04-22 22:00:42 · 492 阅读 · 0 评论 -
POJ-2907(全排列->dfs)(Collecting Beepers)
【题目描述】一个row*col的矩阵,给你起点的位置(x,y),还有其他n个目标点,问你从起点出发,走过每个目标点之后返回到你的起点,最短的路径是多少?【题目描述】由于点不多,可以直接全排列解决,运用dfsbool visited[21];int s, t, x, m, n, path, cnt, ans, my_map[21][2];void dfs(int a, int b原创 2012-04-22 21:36:52 · 1014 阅读 · 0 评论 -
POJ-4037(分气球)(Distributing Ballot Boxes)
【题目描述】把B个气球分给N个城市,使得每个城市竞争这些气球的人最少【解题思路】官方解答,二分#define maxpop 5000000int a[500000];int N, B;bool ok(int x){ int c = 0, i; for (i = 0; i < N && c <= B; ++i) c += (a[i] + x - 1) / x; re原创 2012-04-19 16:44:50 · 667 阅读 · 0 评论 -
POJ-4039(编译原理)(Guess the Numbers)
【题目描述】给出a,b,c的组合2,3,4,可能通过((a+b)*c)求出14吗?【解题思路】参考官方解题报告const int MAXVAR = 5;typedef struct expr { char op; int * v; expr * izq; expr * der;} expr;int values[MAXVAR];string ex原创 2012-04-19 16:03:31 · 623 阅读 · 0 评论 -
POJ-4042(简单几何)(Regular Convex Polygon )
【转载自】http://blog.ac521.org/?p=135&replytocom=24【题目描述】给你三个顶点,这三个点是一个正多边形上的顶点,问这个正多边形最少有多少个边?【解题思路】三个点,三角形–>外接圆–>必定也是该凸多边形的外接圆-我们可以把三个点当做一个三角形放在它的外接圆上,然后求出每个角的度(即三角形分的三个弧度所对应的圆周角),设顶点数为n,我们只需计转载 2012-04-18 14:20:41 · 830 阅读 · 0 评论 -
SOJ-3385,2689,2485+POJ-2676,2918(趣味数独)(Sudoku)
int d[10][10];int row[10][10], col[10][10], square[10][10];int INDEX;struct my{ int x, y;} wo[100];int getsquare(int i, int j){ return i / 3 * 3 + j / 3;}int check(int x, int y, int k)原创 2012-05-01 17:09:43 · 1417 阅读 · 0 评论 -
POJ-3282(摆渡问题)(Ferry Loading IV )
【题目描述】一个渡河问题,船每次最多可以载n辆车,单程渡河的时间是t,有m辆车要渡河,问最少时间把所有车运过河去的时间是多少,这个情况下,最少的运输次数是多少。【解题思路】见代码#define max 1000000int a[max];char b[max][10];int main(){ long int ncase, l, m, sum1, sum2, t原创 2012-04-18 13:17:33 · 964 阅读 · 0 评论 -
POJ-2504(简单几何)
【解题报告】已知三角形的顶点坐标为(xx1,yy1),(xx2,yy2)和(xx3,yy3),要求外接圆圆心坐标(x,y),有圆心O到三个顶点A,B,C距离相等,可得两个方程,联立求解这两个方程,即可得外接圆圆心坐标,而根据已经求得的圆心坐标和向量旋转公式就可以求出正多边形其它顶点的坐标,将向量OA逆时针旋转t角度的向量OB,则向量旋转公式为:(B点坐标为(xx,yy),A点坐标为(xx1,yy1原创 2012-03-15 15:59:50 · 819 阅读 · 0 评论 -
POJ-2591(经典打表)
【Description】Set S is defined as follows: (1) 1 is in S; (2) If x is in S, then 2x + 1 and 3x + 1 are also in S; (3) No other element belongs to S. Find the N-th element of set S, if we so原创 2012-03-14 18:23:03 · 687 阅读 · 0 评论 -
POJ-2479&2593(最大两段和)
【题目描述】 给出一个长度小于或等于1000的序列,求出两个子序列,让其和最大,输出最大和。比如例子的1 -1 2 2 3 -3 4 -4 5 -5结果就是 {2,2,3,-3,4} and {5},也就是要输出最大和13【解题思路】在输入的同时,进行一次动态规划,计算出从左到右的最大值,并把它保存在数组dp的对应的下标元素中,这样之后,对于下标为i的元素, 它其中保存的便是前原创 2012-03-14 18:01:13 · 444 阅读 · 0 评论 -
SOJ-2984(Fibonacci,矩阵连乘简化计算)
typedef int ll;#define MOD 10000int main(){ //freopen("Fibonacci.in", "r", stdin); //freopen("Fibonacci.out", "w", stdout); ll n; ll t[10000]; while (scanf("%d", &n) == 1 && n原创 2011-11-02 10:17:54 · 493 阅读 · 0 评论 -
SOJ-1009(dollars,简单动态规划)
ll s[] = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};int main(){ ll i, j; ll d[5005] = {0}; d[0] = 1; for (i = 0; i <= 10; ++i) { for (j = 0; s[i] + j <= 5000; ++j) d[s[原创 2011-10-31 15:24:00 · 1545 阅读 · 0 评论