2012年1月1日
摘要: UVA_10670 一开始不知道rounding down是四舍五入的意思,还以为是向下取整,果断就疑惑了…… 贪心的思路不难想到,如果减半不会使文件少于M且比单份划算的话就一直用减半即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 110int N, M, L, cost[MAXD], a[MAXD], b[MAXD], r[MAXD];char name[MAXD][20], temp[110];int cmp(const void *_p, const void * 阅读全文
posted @ 2012-01-01 16:49 Staginner 阅读(351) 评论(0) 推荐(0)
摘要: UVA_10382 这个题目的数据好像还是比较厚道的,应该没有太刁难的数据。 实际上对于每个喷头我们算它能够喷到范围应该是按矩形去算的,因为多出来的那点弧和边之间是有空隙的。这样我们就能将喷头的喷洒范围转化成对应的区间,于是这个题目就变成了区间覆盖问题。#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define MAXD 10010int N, L, W, r[MAXD], w[MAXD], x[MAXD];double left[MAXD], righ 阅读全文
posted @ 2012-01-01 15:49 Staginner 阅读(553) 评论(0) 推荐(0)
摘要: UVA_10718 为了使最后or运算的值最大,我们不妨从二进制位的最高位开始依次考虑。如果该位是0的话,我们应该尽量让其变成1,这时我们就可以依据我们的意图算出M可能的最小值和最大值,如果这个区间和L、U这个区间有交集的话,就说明我们是可以把这一位变成1的。同理,如果该位是1的话,无论M的这位是什么,最后这位还是为1,但为了让M尽量小,我们应该尽可能让这一位为0。当然,这时你是否会怀疑这样一个问题,如果这位为0的话,相比为1就会让整体的可能值变小了,会不会后面有1位是0而我们即便该位选1都达不到下限呢?这个是不会的,因为如果该位选1都达不到下限就说明后面全部是1都达不到下限,那么只能说明在上 阅读全文
posted @ 2012-01-01 15:06 Staginner 阅读(788) 评论(1) 推荐(1)
摘要: UVA_10400 这个题目可以用dp去解,不妨用f[i][j]表示到第i个数时得到j是否可能,如果可能值为1,否则值为0。由于有负数,所以我们可以把j加32000后再修改对应的f[i][j]的值,这样我们就只要依次递推去看最后f[N-1][target+32000]是否为1即可。 此外,这个题目要求打印路径,我们在打印路径有两种选择,一种是记录此步的操作,一种是记录上一步的结果。选择记录此步的操作往往比较简便,但由于这个题目可能存在特殊的数据,比如3 1000 0 3 3,如果设计到乘0的操作,我们就没办法通过记录的此步的操作来获取上一步的值了,因此,这个题目还是用记录上一步结果的方式来.. 阅读全文
posted @ 2012-01-01 14:29 Staginner 阅读(365) 评论(0) 推荐(0)