上一页 1 ··· 46 47 48 49 50 51 52 53 54 ··· 85 下一页
  2012年1月11日
摘要: SGU_112 用Java的BigInteger很容易实现。import java.math.BigInteger;import java.util.Scanner;public class Solution { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int a, b; while(cin.hasNext()) { a = cin.nextInt(); b = cin.n... 阅读全文
posted @ 2012-01-11 21:40 Staginner 阅读(243) 评论(0) 推荐(0) 编辑
摘要: SGU_111 又一次写大数开平方了,由于Java写起来比较方便,所以就直接用Java写了。import java.math.BigInteger;import java.util.Scanner;public class Solution { public static void main(String[] args) { Scanner cin = new Scanner(System.in); BigInteger X; while(cin.hasNext()) { X = cin.nextBigInte... 阅读全文
posted @ 2012-01-11 21:23 Staginner 阅读(341) 评论(0) 推荐(0) 编辑
  2012年1月3日
摘要: UVA_757 显然钓鱼是不会走回头路的,因为如果走回头路一定不会最优。 于是我们就可以枚举走到的位置,剩下的问题就是在这些可以到达的河中怎么钓鱼会更优,由于各个河是没有影响的,于是我们就可以枚举可供消耗的时间,在当前时刻一定会选择鱼最多的河去钓,需要注意的是,由于题目对输出的特殊要求,即便当前最多只能钓0条,那么也得去钓。#include<stdio.h>#include<string.h>#define MAXD 30int N, H, d[MAXD], f[MAXD], t[MAXD], now[MAXD], plan[MAXD], use[MAXD];long 阅读全文
posted @ 2012-01-03 01:17 Staginner 阅读(512) 评论(0) 推荐(0) 编辑
摘要: UVA_10148 这个问题和区间选点问题是类似的。我们可以首先把区间按右端点排序,然后从左向右依次安排广告牌,对于每个区间,我们应该尽量将广告牌安排在右边,这样能够使广告牌覆盖尽可能多的区间。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 20010#define MAXN 1010#define D 10000int a[MAXN], b[MAXN], K, N, r[MAXN], hash[MAXD];int cmp(const void *_p, const void 阅读全文
posted @ 2012-01-03 00:18 Staginner 阅读(400) 评论(0) 推荐(0) 编辑
  2012年1月2日
摘要: UVA_11000 首先分几堆是由某个维度的背包数量的最大值决定的,有了堆数K之后,我们只要按背包的维度递增的顺序依次把每个背包按1,2,…,K,1,2…这样的顺序放到每个堆里即可,这样对于任意一个堆一定不会出现重复的背包。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 10010int a[MAXD], N, K, r[MAXD], num[MAXD], first[MAXD], next[MAXD], v[MAXD];int cmp(const void *_p, con 阅读全文
posted @ 2012-01-02 21:47 Staginner 阅读(535) 评论(0) 推荐(0) 编辑
摘要: UVA_10716 首先要预判一下是否可以构成回文串,剩下的工作就是看怎么移动了。 在移动的时候我们不妨先用点贪心的思想,每次应该先把两端的变成回文,如果我们先让两端变成回文之后,这样中间的字符在移动的时候就有可能少和1个移到两端的字符发生交换,因此这样的决策不会产生负面影响。 接下来就是去想我们要怎样让两端变成回文的了,其中一个猜想就是如果两端字符不同,那么就固定两端之一不动,通过移动另外一个字符使两端成为回文的,而且哪种方式交换次数少就选择哪种方式。至于为什么这么做,我暂时只是感觉可以,并没有进行严谨的证明。#include<stdio.h>#include<string 阅读全文
posted @ 2012-01-02 20:34 Staginner 阅读(596) 评论(0) 推荐(0) 编辑
  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 阅读(340) 评论(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 阅读(546) 评论(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 阅读(777) 评论(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 阅读(356) 评论(0) 推荐(0) 编辑
上一页 1 ··· 46 47 48 49 50 51 52 53 54 ··· 85 下一页