poj
马冬冬
手艺人
展开
-
poj1018
大致题意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths 和 价格prices。现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得B/P最大。其中B为这n件设备的带宽的最小值,P为这n件设备的总价。转载 2014-04-14 11:34:24 · 332 阅读 · 0 评论 -
poj1276
提示:动态规划,多重背包 题目大意:有各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额。 初始思路:多重背包问题,第i种面额d[i]有 n[i]+1种选择方案可以转化为01背包问题处理转化的大概思路就是把 每种面值乘以其不同的个数,把得到的不同金额作为一件新的独一无二转载 2014-04-14 17:32:43 · 319 阅读 · 0 评论 -
poj1862
我们都知道,x1+x2>=2*sqrt(x1*x2).记c=2*sqrt(x1*x2),那么c一定大于x2。题目要输出剩余最小的重量,所以每次选重量最大的两个数计算,这样保证剩下的重量最小。一道贪心算法题,如果想通数学原理,程序很简单。#includeint cmp(const void *a,const void *b){ return *(int *)b-*(int *)a;原创 2014-03-29 10:42:48 · 467 阅读 · 0 评论 -
poj1050
最大字段和的扩展。程序中遍历mei原创 2014-04-14 19:23:38 · 421 阅读 · 0 评论 -
poj1083
这种思想还挺有意思的。用length数组记录mei原创 2014-04-14 19:28:16 · 442 阅读 · 0 评论 -
poj1088
挺基础的一道dfs题。#include#include#include#includeint map[105][105],vis[105][105];int m,n;int f[][2]={{0,1},{0,-1},{-1,0},{1,0}};int max(int a,int b){ if(a>b) return a; return b;}int dfs(i原创 2014-04-14 19:33:35 · 327 阅读 · 0 评论 -
poj1111
又是一道dfs基础题,马上要上研究生了,估计y原创 2014-04-14 19:37:08 · 809 阅读 · 0 评论 -
poj1118
学了一个小的知识点,判断两个点是否在原创 2014-04-14 19:40:37 · 372 阅读 · 0 评论 -
poj1321
依然是dfs题目#include#include#includeint n,k,num;char map[10][10];int can[10][10];int mark[10];void dfs(int t,int m){ int i; if(t>k) { num++; return; } if(m>=n) { return原创 2014-04-14 19:50:59 · 343 阅读 · 0 评论 -
poj1322
题意:包里有无穷多个巧克力,巧克力有c种颜色,每次从包里拿出不同颜色巧克力的概率都是相等的,桌面的巧克力不允许颜色相同,若某次拿出的巧克力与桌上的巧克力颜色相同了,则将两颗巧克力都吃掉。计算进行n次拿巧克力的操作后,桌上有m颗巧克力的概率,输出结果精确到小数点后三位。用dp[ i ][ j ] 表示进行 i 次操作后桌面上有 j 颗巧克力的概率,状态转移方程:dp[ i ][ j ] +=转载 2014-04-14 20:06:41 · 684 阅读 · 0 评论 -
poj1562
dfs题目#include#include#include#includeint n,m;char map[110][110];int num;int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1}, {1,1},{1,-1},{-1,1},{-1,-1}}; void dfs(int t,i原创 2014-04-15 09:39:06 · 860 阅读 · 0 评论 -
poj1330
我自己本来想用静态结构体的,从网上找的这篇代码只用一个数组就搞定,思想一样。#include#include#include#includeint main(){ int t; int anc[10001]; int n,a,b,i; int vis[10001]; scanf("%d",&t); while(t--) { memset(anc,-1,原创 2014-03-29 11:28:05 · 406 阅读 · 0 评论 -
poj1401
这道题的思路是从1到n的数中有几个5的倍数,如果是10、20、30等等这些数,因子中只有一个5,所以算一次。如果是25,50,75等等这些数,因子中有5的平方,所以算两次。依此规律,125,625等等同样可以这样算。不可以从1到n遍历,否则会TLE。#include#include#include#includeint main(){ int n; int t,i,c; in原创 2014-03-30 16:29:42 · 435 阅读 · 0 评论 -
poj1631
传说中的最长非降子序列原创 2014-04-15 09:42:20 · 403 阅读 · 0 评论 -
poj1742
多重背包问题,有时间好好补补beib原创 2014-04-15 09:46:08 · 320 阅读 · 0 评论 -
poj1338
原来这种方法叫打表。假设a[n]表示第n个这样的数,则a[1]=1,显然,更大的丑数只能由小的丑数通过乘以2,3,5得到.维护三个头指针,一个尾指针.头指针h1,h2,h3分别指向a[h1],a[h2],a[h3]分别乘以2,3,5能够比目前得到的最大丑数稍大的最小丑数,尾指针则指向目前最大的丑数.显然,如果乘积小于最大的丑数,那就将头指针后移.否则选择三个值中最小的那个加入队尾,直到尾指针到原创 2014-04-14 20:16:00 · 756 阅读 · 0 评论 -
poj1844
为什么别人感觉很简单的问题我却感觉很难呢?首先变量i从1加到n,和为sum,当sum>=k且sum-k为偶数时为正确结果。分析:当sum>=k时,说明1到n中有一个数前面要改成负号。但是改成负号后的sum1和sum什么关系呢?显然两者sum1=k而且sum-k为偶数时一定可以满足条件。#includeusing namespace std;int main(){ int n;原创 2014-03-29 11:05:55 · 452 阅读 · 0 评论 -
poj2917
思路:因为1/x + 1/y = 1/n,则x+y / xy = 1/n,令x = n+a, y = n+b(x,y必定大于n),则等式可以化成a*b = n^2;因为a,b都是整数,所以a,b必定是n^2的约数,找出n^2的所有约数,即可找出所有满足题意的解。由于要满足x <= y所以只需找出a <= b的解的个数即可,设约数个数为num,则答案为(num+1)/2。那么如何找出n^2的约数个数原创 2014-03-31 09:22:16 · 375 阅读 · 0 评论 -
poj3663
学到一种排序的小的优化技巧。#include#include#include#includeint cmp(const void *a,const void *b){ return *(int *)a-*(int *)b; }int main(){ int n,s; int a[20002]; int i,num,temp,j; while(scanf原创 2014-03-31 09:44:52 · 474 阅读 · 0 评论 -
poj1564
dfs题目#include#include#include#includeint num[13],temp[13],flag,t,n;void dfs(int sum,int index,int cnt){ int i; if(sum==0) { flag=1; printf("%d",temp[0]); for(i=1;i<cnt;i++)原创 2014-04-15 09:40:44 · 646 阅读 · 0 评论 -
poj1837
题目大意:有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。其中可以把天枰看做一个以x轴0点作为平衡点的横轴输入:2 4 //C 钩子数 与 G钩码数-2 3 //负数:左边的钩子距离天平中央的距离;正数:右边的钩子距离天平中央的距离c[k]3 4 5 8 //G个重物的质量w[i]转载 2014-04-15 15:29:49 · 522 阅读 · 0 评论 -
poj2485
最小生成树,PRIM算法原创 2014-04-15 19:46:19 · 328 阅读 · 0 评论 -
poj1915
bfs类的题目#include#includeusing namespace std;int map[305][305],vis[305][305];int enx,eny,size,bex,bey;int dx[]={1,1,-1,-1,2,2,-2,-2}; int dy[]={2,-2,2,-2,1,-1,1,-1}; void bfs(){ int vx,v原创 2014-04-15 15:53:47 · 417 阅读 · 0 评论 -
poj3628
,dfs,01背包问题原创 2014-04-15 20:10:15 · 408 阅读 · 0 评论 -
poj2006
化学计算题,解一元二次方程#include#includeint main(){ double ka,acid,temp,res; int m,n; while(1) { scanf("%lf%lf%d%d",&ka,&acid,&m,&n); if(ka==0&&acid==0&&m==0&&n==0) break; temp =转载 2014-04-15 16:19:30 · 323 阅读 · 0 评论 -
poj2828
线段树类问题原创 2014-04-15 19:51:58 · 469 阅读 · 0 评论 -
poj2917
题意:给出n,求1/n=1/x+1/y(n,x,y=1,2,3...)的解的个数分析:n = (x*y)/(x+y) (x+y)*n = x*y设x = n+a; y = n+b带入可以得到n*n = a*b题目就转化成了求所有整数对使得a*b = n*n。即求n*n的约数个数,由于约数都是成对出现的,两数乘积为n^2,为奇数是因为n与n成对出现,而只计算了1次转载 2014-04-15 19:57:44 · 484 阅读 · 0 评论 -
poj3051
dfs题目#include#include#includeint w,h;char map[1010][100];int num;int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};void dfs(int t,int u){ int i,a,b; num++; map[t][u]='.'; for(i=0;i<4;i++)原创 2014-04-15 19:59:18 · 419 阅读 · 0 评论 -
poj3615
Floyd算法题目#include#include#include#includeint min(int a,int b){ if(a>b) return b; return a; }int max(int a,int b){ if(a>=b) return a; return b;}int main(){ int n,m,t; int i,原创 2014-04-15 20:05:25 · 320 阅读 · 0 评论 -
poj3660
传递闭包问题原创 2014-04-15 20:13:46 · 431 阅读 · 0 评论 -
poj2078
dfs类题目#include#include#includeint n,max,min,sum;int num[10][10];void move(int m){ int a,i; a=num[m][n]; for(i=n-1;i>=1;i--) { num[m][i+1]=num[m][i]; } num[m][1]=a;}void df原创 2014-04-15 16:23:40 · 694 阅读 · 0 评论 -
poj2356
抽屉原理题目原创 2014-04-15 19:40:37 · 653 阅读 · 0 评论 -
poj1887
最长下降子序列原创 2014-04-15 15:47:35 · 441 阅读 · 0 评论 -
poj2299
归并排序#include#include#include#define N 500005int a[N],b[N];long long count;void merge(int l,int mid,int r){ int i=0,j=l,k=mid+1; while(j<=mid&&k<=r) { if(a[j]>a[k]) { b[原创 2014-04-15 16:40:12 · 315 阅读 · 0 评论 -
poj2318
二分查找#include#include#include#include#includeusing namespace std;#define maxn 5005struct Line{ int u,d;}line[maxn];int n,m,x1,x2,y1,y2;int toy[maxn];bool left(int x,int y,Line a){原创 2014-04-15 16:42:36 · 368 阅读 · 0 评论 -
poj3624
01背包问题#includeint main(){ int dp[13000],n,m; int w[3500],d[3500],i,j; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d%d",&w[i],&d[i]); } memset(dp,0,sizeof(dp)); for(i=原创 2014-04-15 20:07:40 · 431 阅读 · 0 评论 -
poj1953
斐波拉契数列。简单说明:输入1时,结果有两种:0,1;输入2时,结果有00,01,10,输入三时,结果有000,001,010,100,101……无论输 入几,总结过数都是最后一位为0的数字个数加上最后一位为1的数字个数,而当前一位要产生1,前一位最后只能是0,当前一位要产生0,前一位最后可以为 1,也可以为0。设O[i]、Z[i]分别表示i位数的最后一位为0的数和最后一位为1的数转载 2014-04-15 16:00:34 · 1570 阅读 · 0 评论 -
poj1975
floyd 传递闭包转载 2014-04-15 16:17:01 · 583 阅读 · 0 评论 -
poj2184
01背包问题#include#include#define INF 1000000#define MAX_LMT 210000#define MAX_N 110#define DELTA 10000int max(int ,int );int main(){ int n,cost[MAX_N],val[MAX_N],dp[MAX_LMT]; int i,j;原创 2014-04-15 16:28:01 · 420 阅读 · 0 评论 -
poj2247
同poj1338#include#include#includeint min(int a,int b,int c,int d){ int m,n; m=(a>b)?b:a; n=(c>d)?d:c; return ((m>n)?n:m);}int main(){ int n,p2=1,p3=1,p5=1,p7=1,i; long long num[5原创 2014-04-15 16:37:14 · 424 阅读 · 0 评论