2011年11月6日
摘要: UVA_437 首先将一个长方体变成3个来存储,然后按底面积的大小升序排列,最后求一个最长上升子序列即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 110int N, f[MAXD], a[5][MAXD], r[MAXD];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int *q = (int *)_q; return a[0][*p] * a[1][*p] - a[0][*q] * a[1 阅读全文
posted @ 2011-11-06 22:03 Staginner 阅读(449) 评论(0) 推荐(0) 编辑
摘要: UVA_10285 这个题目可以用记忆化搜索实现,f[i][j]记录的是周边四个点可以深搜到的最大值加1。 枚举一遍i、j并进行记忆化搜索即可。#include<stdio.h>#include<string.h>#define MAXD 110char b[110];int N, M, a[MAXD][MAXD], f[MAXD][MAXD], max;int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};void init(){ int i, j; scanf("%s%d%d", b, &N, &a 阅读全文
posted @ 2011-11-06 20:35 Staginner 阅读(417) 评论(0) 推荐(0) 编辑
摘要: UVA_10465 这个题目可以用初等数学的方法求解,给定m和n,求保证m*x+n*y<=t的条件下x+y的最大值,同时要优先保证m*x+n*y尽可能和t接近。因此x、y可能的取值点就是在m*x+n*y=t这条直线下方且紧邻直线的点,扫描一遍这些点并更新结果即可。 当然这个题目也可以用完全背包来写,同时要注意在所用时间相同的情况下如果个数变大了也要更新一下。#include<stdio.h>#include<string.h>int m, n, T;void solve(){ int i, j, x, y, t, num; x = 0, y = T / n; t 阅读全文
posted @ 2011-11-06 02:40 Staginner 阅读(367) 评论(0) 推荐(0) 编辑