摘要: 简单题View Code #include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;int main(){ //freopen("D:\\t.txt", "r", stdin); int t; scanf("%d", &t); long long n,m; for (int i = 0; i < t; i++) { scanf("%I64d 阅读全文
posted @ 2011-03-19 18:39 金海峰 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 素数筛法,然后判断有几个即可。View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>using namespace std;#define maxn 32005int prm[maxn];bool is[maxn];int getprm(int n){ int i, j, k = 0; int s, e = (int) (sqrt(0.0 + n) + 1); memset(is, 1, siz 阅读全文
posted @ 2011-03-19 16:57 金海峰 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 我们把所给数字制成条形统计图,如果确定了最终平面位置,我们把最终平面想象成地面,所有的条形图的上边缘想象成从地面向上或向下长出的山峰。我们的结果就是所有右侧山坡的垂直高度之和加上最右面一点到地面的距离。我们发现在两端点竖直高度值之间平移地面,结果不会有变化。如果移出这个范围,右侧山坡的垂直高度之和不变,而最右边一点到地面的距离会凭空增加。所以地面必然在两端点竖直高度之间。我们只需要计算右侧山峰高度值和即可,不妨把地面定在最左侧点的高度。View Code #include <iostream>#include <cstdio>#include <cstdlib&g 阅读全文
posted @ 2011-03-19 16:38 金海峰 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 二分加dp。dp我用的是顺推,二分查找总时间,对于每个总时间进行dp确定能否在其限制内完成任务。f[i][j]表示前i个工人完成j件a的情况下最多完成多少件b。f[i + 1][j + k] = max(f[i + 1][j + k], f[i][j] + (t - worker[i + 1].a * k) / worker[i + 1].b);View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std; 阅读全文
posted @ 2011-03-19 15:48 金海峰 阅读(154) 评论(0) 推荐(0) 编辑
摘要: Fibonacci数列的通项公式中由于(sqrt(5)-1)^n太小了,所以可以忽略,但是n必须大于16。这道题就是应用通项公式对10取对数的方法来做的,去除对数的整数部分就相当于把结果除以许多个10。View Code #include<stdio.h>#include<math.h>#define a (sqrt(5.0)+1.0)/2int main(){ int n,i,j,t,f[21]={0,1}; double ans; for(i=2;i<21;i++) f[i]=f[i-1]+f[i-2]; while(scanf("%d", 阅读全文
posted @ 2011-03-19 15:45 金海峰 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 用dfs进行整数拆分,对于每种情况计算组合数。为了避免重复计算,必须使用有重集的组合,com(f[i] - 1 + num[i], num[i]),这是num[i]个有i个节点的子树的情况总数。这个公式是用于求所选物品可重复选择,且重复选出的同一物品完全相同的情况。View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>using namespace std;#define maxn 41long 阅读全文
posted @ 2011-03-19 15:39 金海峰 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 匈牙利算法。在二分图中每行对应一个节点,每列对应一个节点,每个1对应一条连接该1所在行和列节点的边。如果最大匹配数==n则可行,否则不行。对于可行的情况,只需要每次交换两个列节点的编号,直到所有的匹配都是行号==列号的为止。View Code #include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <vector>using namespace std;#define maxn 105int n, ptn[maxn], ans[m 阅读全文
posted @ 2011-03-19 15:19 金海峰 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 欧拉函数的原始公式是用n连乘(1-1/pi)。pi是n的素因子。我们可以通过一个n^2级筛法的方式去筛,这样就保证了每个合数都会被其所有素因子筛一次,只要在筛的时候在其结果上乘上1-1/pi)即可。View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;#define maxn 3000005double ans[maxn];bool prime[maxn];int next(int a){ a += 阅读全文
posted @ 2011-03-19 15:13 金海峰 阅读(159) 评论(0) 推荐(0) 编辑