void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2011年5月31日

摘要: 给定一个整数n,要找出n能拆分成多少种不同的若干个数的和与乘积的形式。比如: 4=4 12=1*12 4=1+3 12=2*6 4=2+2 12=3*4 4=1+1+2 12=2*2*3 4=1+1+1+1 先看加法形式,可以构造一个母函数F(x)=(1+x+x^2+...+x^n)(1+x^2+x^4+...+x^n)...(1+x^n),将这个母函数展开后,求出每一个x^k前面的系数Ck,就是对应的整数K有多少种拆分的形式。#include <iostream> using namespace std; const int MAXN = 120; int c1[MAXN+1], 阅读全文
posted @ 2011-05-31 23:56 void-man 阅读(1834) 评论(1) 推荐(0) 编辑

摘要: 给出几种颜色需求的ml量,然后最后一个数是灰色需求量,灰色可以由任何三中不同颜色的颜色组成,每个颜料盒有所给出的颜色的炎凉50ml问最少给出几个颜料盒,可以组成所需求颜色 显然贪心可以解决,先求出满足的普通色所需的最小盒数,然后把剩余颜料从大到小排列,那前三种每个取出1ml组成1ml的灰色,在这里本来我是把选出三个颜色中,直接选取第三个(最小容量)的所有容量k,组成kml的灰色,后来发现不行,贪心必须每次都要要求最好所以每次1ml来选才能达到要求#include <stdio.h>#include <string.h>#include <algorithm> 阅读全文
posted @ 2011-05-31 23:16 void-man 阅读(392) 评论(0) 推荐(0) 编辑

摘要: 给出一个整数序列,求出两个连续序列和的和最大值,这两个序列不必连续,但是不能交叉可以先正向求一次最大和,dp[i]表示i之前包括i的最大连续和的值然后反向求一次最大和,相加dp[i]对比求出最大值#include <stdio.h>#define MIN -9999999int main(){ int T; scanf("%d",&T); int sum,tmp,n,ans; int num[50001],dp[50001]; while(T--) { scanf("%d",&n); sum=0; tmp=MIN; for(i 阅读全文
posted @ 2011-05-31 23:04 void-man 阅读(195) 评论(0) 推荐(0) 编辑

摘要: 给出一些不合法的括号表达式,然你求出最短的合法的s[]是读入的字符串f[i][j]是i到j的最少的添加数c[i][j]是对应的添加方案分几种情况s[i] == '[' 在右端添 ']' 并求解 s[i + 1][j]s[i] == '('s[j] == ')'s[j] == ']'类似处理s[i] == '[' && s[j] == ']' ,求解s[i + 1][j - 1] s[i] == '(' && s[j] == ') 阅读全文
posted @ 2011-05-31 22:58 void-man 阅读(181) 评论(0) 推荐(0) 编辑

摘要: 题目描述,给出一个整数,问你有多少种情况能把这个整数拆分成对称并且是双峰序列的和?1: (1) 2: (2), (1 1) 3: (3), (1 1 1) 4: (4), (1 2 1), (2 2), (1 1 1 1) 5: (5), (1 3 1), (1 1 1 1 1) 6: (6), (1 4 1), (2 2 2), (1 1 2 1 1), (3 3), (1 2 2 1), ( 1 1 1 1 1 1) 7: (7), (1 5 1), (2 3 2), (1 1 3 1 1), (1 1 1 1 1 1 1) 8: (8), (1 6 1), (2 4 2), (1 1 4 阅读全文
posted @ 2011-05-31 22:32 void-man 阅读(272) 评论(0) 推荐(0) 编辑