上一页 1 2 3 4 5 6 7 8 9 10 ··· 20 下一页
摘要: 题目大意:给一个建筑的序列,建筑用高度和宽度描述,找出按高度的LIS和LDS,最长XX子序列的长度按照序列中建筑的宽度和进行计算。 其实就是带权的最长XX子序列问题,原来是按个数计算,每个数权都是1,现在有不同的权重。 1 #include 2 #include 3 using namespace std; 4 #define MAXN 100000 5 6 int h[MAXN], w[MAXN], lis[MAXN], lds[MAXN]; 7 8 int main() 9 {10 #ifdef LOCAL11 freopen("in", "r", 阅读全文
posted @ 2013-09-08 14:56 xiaobaibuhei 阅读(393) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给一个车辆到达车站的序列(按时间先后),可以对车辆进行以下处理:插在队首、插在队尾或者拒绝进站。车站内的车辆必须按照重量大小从大到小排列,问车站内最多能有多少辆车辆? 假设车i是第一个进站,那么在i后面的车辆如果比i车重,可以插在i的前面,如果比i车轻,可以插在i的后面。这就变成了求以i为起点的最大递增子序列和最大递减子序列了,i首先进站的最大长度为LIS(i)+LDS(i)-1,找出其中的最大值就可以了。 1 #include 2 #include 3 using namespace std; 4 #define MAXN 2010 5 6 int a[MAXN], l... 阅读全文
posted @ 2013-09-08 14:27 xiaobaibuhei 阅读(418) 评论(0) 推荐(0) 编辑
摘要: 题目大意:一种拦截导弹能拦截多枚导弹,但是它在每次拦截后高度不会再升高,给出导弹的序列,问最多能拦截多少枚导弹? 最长递减子序列问题。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 vector m, lds; 7 8 int main() 9 {10 #ifdef LOCAL11 freopen("in", "r", stdin);12 #endif13 int x, kase = 0;14 while (scanf("%d", &x) != EOF 阅读全文
posted @ 2013-09-08 10:55 xiaobaibuhei 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给定一种估算Pi的方法:给出一系列随机数,从中任选两个数,这两个数的最大公约数不大于1(互质)的概率为6/(Pi*Pi),然后给出一系列数,据此估算Pi的值。直接模拟就好了。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int gcd(int a, int b) 7 { 8 return b == 0 ? a : gcd(b, a%b); 9 }10 11 int main()12 {13 #ifdef LOCAL14 freopen("in", "r", stdin) 阅读全文
posted @ 2013-09-08 09:15 xiaobaibuhei 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 题目大意:关于最大公约数(Greatest Common Divisor, GCD)的,直接照着题目说的做就可以了。 1 #include 2 3 int gcd(int a, int b) 4 { 5 return b == 0 ? a : gcd(b, a%b); 6 } 7 8 int main() 9 {10 int n;11 while (scanf("%d", &n) && n)12 {13 int g = 0;14 for (int i = 1; i < n; i++)15 for ... 阅读全文
posted @ 2013-09-07 21:28 xiaobaibuhei 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 题目大意:Peter有n支烟,每k个剩下的烟头可以卷成一支新烟,问Peter能吸多少跟烟? 简单数学题。 1 #include 2 3 int main() 4 { 5 #ifdef LOCAL 6 freopen("in", "r", stdin); 7 #endif 8 int n, k; 9 while (scanf("%d%d", &n, &k) != EOF)10 {11 int ans = n, butt = n;12 while (butt >= k)13 {14 i... 阅读全文
posted @ 2013-09-07 20:22 xiaobaibuhei 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 题目大意:有一根长l的木棍,有n个切割点要把这根木棍切成n+1段,知道n个切割点的位置。切割一段长度为d的木棍需要的花费为d,如一段长度为10的木棍,有3个切割点:2,5,7,如果按切割点位置从左到右进行切割,所需花费为10+8+5。找出合理的切割顺序使得花费最小。 想到了最优矩阵链乘...dp,使用自顶向下带备忘的dp方法,cost[left][right]记录切割从第left个切割点到第right个切割点所需的最小花费。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 int co... 阅读全文
posted @ 2013-09-07 15:40 xiaobaibuhei 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 题目大意:一个潜水者去海底寻找金子,已知有n个有金子的地点,分别给出他们的深度和价值。但是由于潜水者只有一瓶氧气,所以他只能在海底呆有限的时间,问他如何才能在这有限的时间里获得尽可能多的金子,并打印出方案。 dp中的0-1背包问题,得到最大值后根据dp数组可得到解决方案。采用“后i个物品”的规划方向可以使打印方案变得简单一点,详见《算法竞赛入门经典》9.3节。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int d[35], v[35], dp[35][10000]; 7 vector ans; 8 9... 阅读全文
posted @ 2013-09-07 10:34 xiaobaibuhei 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 题目大意:商场进行促销活动,有n件商品,给出每件商品的重量和价格。一家人去购物,每个人只能搬运wi重量的物品,而且每种商品只能购买一件,问这家人最多能买多少钱的商品。典型的0-1背包问题。 1 #include 2 #include 3 using namespace std; 4 5 int p[1010], w[1010]; 6 int dp[1010][35]; 7 8 int main() 9 {10 #ifdef LOCAL11 freopen("in", "r", stdin);12 #endif13 int T;14 scanf(" 阅读全文
posted @ 2013-09-06 16:45 xiaobaibuhei 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 题目大意:有n首歌曲要录制到磁带上,每首歌长ai分钟,磁带可录制l分钟的歌曲。 由于n 2 #include 3 using namespace std; 4 5 vector t, ans; 6 int a[25]; 7 int tape, n; 8 int sum, lmax; 9 10 void dfs(int cur)11 {12 if (cur == n)13 {14 if (sum > lmax) 15 {16 lmax = sum;17 ans.clear();18 ... 阅读全文
posted @ 2013-09-06 16:12 xiaobaibuhei 阅读(188) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 10 ··· 20 下一页