自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(36)
  • 问答 (1)
  • 收藏
  • 关注

原创 Section 2.3 Money Systems

<br />动态规划思想, 完全背包,迭代。<br />f[i+j] := f[i+j] + f[i];<br /><br />{<br />ID: yaoyuan4<br />PROG: money<br />LANG: PASCAL<br />}<br />Program money;<br /> const<br />  inf = 'money.in'; outf = 'money.out';<br /> var<br />  v, n, i, j, a : longint;<br />  f :

2011-03-08 17:37:00 348

原创 Section 2.3 Training Gateway

<br />用递归模拟出每一种可能,再用一个过程判断即可<br /><br />{<br />ID: yaoyuan4<br />PROG: zerosum<br />LANG: PASCAL<br />}<br />Program zerosum;<br /> const<br />  inf = 'zerosum.in'; outf = 'zerosum.out';<br /> var<br />  n : longint;<br />  s : string;<br /> Function ff(d

2011-03-07 18:02:00 378

原创 Section 2.2 Party Lamps

首先 动1号灯必动7号灯 动2号灯必动8号灯 这样就可以压缩成6个灯 其次 一个按钮按两下等于没按 没按还按啥啊 这样就只有4种按法 接下来做一个 递归回溯就可以了 转换2进制排序的时候只要转前6位 因为前6位大的后面一定大 { ID: yaoyuan4 PROG: lamps LANG: PASCAL } Program lamps; type   conan = array[1..6] of boolean;   lan = record

2010-08-27 18:17:00 406

原创 Section 2.2 Party Lamps

首先 动1号灯必动7号灯 动2号灯必动8号灯 这样就可以压缩成6个灯 其次 一个按钮按两下等于没按 没按还按啥啊 这样就只有4种按法 接下来做一个 递归回溯就可以了 转换2进制排序的时候只要转前6位 因为前6位大的后面一定大 { ID: yaoyuan4 PROG: lamps LANG: PASCAL } Program lamps; type   conan = array[1..6] of boolean;   lan = record

2010-08-27 18:13:00 489

原创 Section 2.2 Runaround Numbers

从M+1开始枚举并判断是否为循环数 注意循环数的性质 数字各不相同 循环到每一个数位 { ID: yaoyuan4 PROG: runround LANG: PASCAL } Program runround; const   inf = 'runround.in'; outf = 'runround.out'; var   m, ans : longint;   f : array[0..10] of longint; Proced

2010-08-27 11:53:00 340

原创 Section 2.2 Subset Sums

这题纠结了一天多 其实想明白了就是个动态规划 更说白点就是个背包 找出和为 N*(N+1) div 4 的方案数 但是如果N*(N+1) div 2 为奇数, 不用找了,肯定不行 然后就做背包 把1。。。N,放进了 F[i] 记录 和为i的方案数 核心DP方法如下    for i := 1 to n do       for j := s-i downto 0 do        if f[j] > 0 then         inc(f[j + i], f[j]); 这个方法绝对是

2010-08-27 10:34:00 301

原创 Section 2.2 Preface Numbering

稍加分析可知罗马数字实际上就是各个位所对应的罗马数字 以252为例 2 对应II 50对应L 200 对应CC,合起来就是 252 = CCLII 由于范围是3500, 就选预存各个数位上的罗马数字 然后构建罗马数字 统计各个字母出现的数量 { ID: yaoyuan4 PROG: preface LANG: PASCAL } Program preface; const   inf = 'preface.in'; outf = 'preface.out';

2010-08-25 14:08:00 375

原创 Section 2.1 Hamming Codes

ans数组用来存结果 ans[1] 为0,然后枚举 知道找出n个 不必排序, 先找出来的一定小 至于判断两个数的海明距离, 用 A = A xor B 再A中1的个数即可 具体参加 百度百科 位运算 http://baike.baidu.com/view/379209.htm?fr=ala0_1 { ID: yaoyuan4 PROG: hamming LANG: PASCAL } Program hamming; const   inf = 'hamm

2010-08-24 21:35:00 316

原创 Section 2.1 Healthy Holsteins

官方分析是2进制枚举 0表示不用 1表示用 而我用的是递归回溯 找到数量最小的并输出 { ID: yaoyuan4 PROG: holstein LANG: PASCAL } Program holstein; const   inf = 'holstein.in'; outf = 'holstein.out'; var   v, g, total, totali : longint;   fx, fy : array[1..1000]

2010-08-24 20:17:00 354

原创 Section 2.1 Sorting A Three-Valued Sequence

用一个数组存原始数据, 一个数组存目标数据 再用一个记录数组 存1,2,3的开始数据与结束的位置 然后找可以一次匹配的,  通过一次交换使两个数都到目标位置的, ans + 1 找完以后再找 3个匹配的, 这需要2次交换 ans + 2 输出ans即可 { ID: yaoyuan4 PROG: sort3 LANG: PASCAL } Program sort3; type   date = record    op, ed : longint;

2010-08-24 18:03:00 279

原创 Section 2.1 Ordered Fractions

我用的是枚举所有分数 判断是否是最简分数 是就加入数组 0/1 和1/1 单独存 然后快排 比较可以用交叉相乘 这样便可不计算分数值 USACO 官方题解是用递归 初始0/1 和 1/1 , 然后分母相加 分子相加 { ID: yaoyuan4 PROG: frac1 LANG: PASCAL } Program frac1; type   date = record    a, b : longint;   end; const

2010-08-24 13:06:00 480

原创 Section 1.5 Checker Challenge

这是个典型的n皇后问题 参见百度百科 8皇后问题 http://baike.baidu.com/view/622604.htm 然后用一个链表技术加以优化即可 http://blog.csdn.net/YY19970227/archive/2010/08/23/5832012.aspx 也就是我转载的那个 { ID: yaoyuan4 PROG: checker LANG: PASCAL } Program checker; const   maxn =

2010-08-23 19:58:00 362

原创 Section 2.1 The Castle

先用DFS做一个Flood Fill 然后枚举墙并判断 记住按照题目要求枚举 具体看标程 这题是挺难的 { ID: yaoyuan4 PROG: castle LANG: PASCAL } Program castle; type   css = record    west, north, east, south : boolean;   end; const   fx : array[1..4] of longint = (1,

2010-08-23 18:02:00 440

原创 转载丶用双链表实现搜索的优化

     搜索是一种基本而又有效的方法,当遇到一个没有很好解决方法的题目时候想到的可能还是搜索。搜索就是把可能的出现的方法依照其搜索标准一一列出,找出需要的解。搜索中为避免无效搜索,常采用剪枝优化,提高搜索效率,如果能在扩展结点处把一些不可能搜索到的结点去掉,利用双链表将可行的解链接起来,避免无效的循环,则可以大大的提高搜索的效率。 下面以USACO1.4跳棋的挑战为例,来讲解一下如何使用循环链表来实现搜索的优化。 [题目描述] 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋

2010-08-23 15:15:00 1193

原创 Section 1.5 SuperPrime Rib

开头只可能是2,3,5,7 结尾只可能是 1,3,7,9 知道了这个 递归求解即可 这是一道练递归的好题 { ID: yaoyuan4 PROG: sprime LANG: PASCAL } Program sprime; const   fx : array[1..4] of longint = (2, 3, 5, 7);   fy : array[1..4] of longint = (1, 3, 7, 9);   inf = 'sprime.

2010-08-23 14:58:00 417

原创 Section 1.5 Prime Palindromes

想法一定要对 枚举没错 关键是构建回文还是构建质数 明显是构建回文 于是本人就用一个 i := 1 to 1000 来构建回文 如250 通过构建变成了 25052 其次 偶数位的回文不是质数 通过数学证明 偶数位的回文数必为11 的倍数 但是11 是个特例 它是回文质数 我用9来表示11 如果当i 循环到9时就不进行变化 直接变成11 我用pal 构建回文 ok 判断质数 结果是1次AC 真爽!!! { ID: yaoyuan4 PROG: pprime LANG: PAS

2010-08-23 14:31:00 447

原创 Section 1.5 Number Triangles

这是一道经典且容易的动态规划(dynamic programming)简称DP 状态转移方程很容易得出 f(i,j) = max(f(i,j) + max(f(i-1,j), f(i-1,j-1)),f(i,j); 当然此题没有复数 所以直接Inc 即可 本人一次AC { ID: yaoyuan4 PROG: numtri LANG: PASCAL } Program numtri; const   inf = 'numtri.in'; outf = 'num

2010-08-23 13:59:00 542 1

原创 Section 1.4 Mother's Milk

由于数据过小, 采取枚举所以的方案 我采用的是递归 用vip(x, y, z) 表示 a, b, c杯中水的情况 另外采用Orz 过程模拟倒水情况 只要想清楚了 我是1次AC的 { ID: yaoyaun4 PROG: milk3 LANG: PASCAL } Program milk3; const inf = 'milk3.in'; outf = 'milk3.out'; var   a, b, c : longint;   f : arr

2010-08-23 12:30:00 306

原创 转载丶Search Techniques

Description 样例: n 皇后问题 [经典问题] 将 n 个皇后摆放在一个 n x n 的棋盘上,使得每一个皇后都无法攻击到其他皇后。 深度优先搜索 (DFS) 显而易见,最直接的方法就是把皇后一个一个地摆放在棋盘上的合法位置上,枚举所有可能寻找可行解。可以发现在棋盘上的每一行(或列)都存在且仅存在一个皇后,所以,在递归的每一步中,只需要在当前行(或列)中寻找合法格,选择其中一个格摆放一个皇后。 1 search(col) 2 if filled all column

2010-08-23 00:58:00 561

原创 Section 1.4 Arithmetic Progressions

咱不会搜索啊 只会枚举 于是就枚举a, b 要求b 在前 所以先枚举b 后枚举a 这样便省去的排序 当然还得先做个布尔数组 存所有双平方数 接下来就 很容易了 关键是a, b的范围 这就要靠RP了 通过分析数据 当m div n > 8 时 b 的 范围可以从 1 to m*m 缩小的1 to m*m div n 靠这个无良的优化 咱便顺利的过掉了此题 但是考试时咋办捏? 要么好好学搜索 至少要会算时间复杂度 { ID: yaoyuan4 PROG: ariprog LAN

2010-08-23 00:24:00 443

原创 Section 1.4 The Clocks

枚举每一种方案就可以过 本人用的是递归处理 思路很容易想 关键是细节处理 做了蛮久的 递归要好好学啊 { ID: yaoyuan4 PROG: clocks LANG: PASCAL } Program clocks; type   clock = array['A'..'I'] of longint;   answer = array[1..9] of longint; const   inf = 'clocks.in'; outf =

2010-08-22 23:07:00 396

原创 Section 1.4 Packing Rectangles

此题是IOI的水平竟放在Section 1 里不可思议 鉴于此题过于难 本人就百度了一下 结果发现N多人代码完全相同 本人也就不好意思说啥了 于是本人就找了一个PASCAL 的代码来分析 先把图标上号 本人是用f[1..4,1..2]来存的 1..4表示图形 1..2记录横竖 有人会问为啥不用记录来存呢?到后面就清楚了 然后枚举编号以及横竖 我是用s数组和d数组做的 通过枚举,又可以的到2个数组 x, y  x记录横着的 y记录竖着的 然后就是公式了 用m 记录长 n记录宽 则

2010-08-22 16:46:00 433

原创 Section 1.4 Prime Cryptarithm

由于数据足够小 只有枚举并判断就行了 由于要多次判断 不用函数将很麻烦 { ID: yaoyuan4 PROG: crypt1 LANG: PASCAL } Program crypt1; const   inf = 'crypt1.in'; outf = 'crypt1.out'; var   n, ans : longint;   f : array[0..9] of boolean; Procedure init;   va

2010-08-22 00:43:00 283

原创 Section 1.3 Calf Flac

另存一个记录数组 date记录字母 大小写应统一 op记录在原数组中出现的位置 这就将原题转换为 字母求回文了 再枚举中间的情况2种 ASA 和ASSA 这样就变得容易很多了 记住数组要开大 { ID: yaoyuan4 PROG: calfflac LANG: PASCAL } Program calfflac; const   inf = 'calfflac.in'; outf = 'calfflac.out'; type   calf

2010-08-22 00:18:00 342

原创 Section 1.3 Barn Pepair

要修M牛棚 则有M-1段是空着的 自然找出前M-1个最大空隙不计 此题数据不大 用排序的话显得普通代码过于臃肿 本人使用的是计算排序思路 开一个 1..200 的数组来记录 代码如下 { ID: yaoyuan4 PROG: barn1 LANG: PASCAL } Program barn1; const   inf = 'barn1.in'; outf = 'barn1.out'; var   m, s, c, ans : longint;

2010-08-21 21:22:00 524

原创 Section 1.3 Mixing Milk

贪心思路 从最便宜的开始买起 ∵Pi 的范围为 0~1000 ∴可以构筑一个 0..1000 的数组F 在Pi 的位置上加上 Ai 然后遍历 这个F 数组即可 排序都不需要 { ID: yaoyuan4 PROG: milk LANG: PASCAL } Program milk; const   inf = 'milk.in'; outf = 'milk.out'; var   n, m, ans : longint;   f : ar

2010-08-21 16:33:00 390

原创 Section 1.2 Dual Palindromes

枚举并判断双回文 本人用了几个过程 shift 进制转换 pal  判断回文 用过程和函数 分步解题 思路就明确了 { ID: yaoyuan4 PROG: dualpal LANG: PASCAL } Program dualpal; type   num = array[0..100] of longint; const   inf = 'dualpal.in'; outf = 'dualpal.out'; var   n,

2010-08-21 11:02:00 298

原创 Introduction

      Introduction Who We AreThe USA Computing Olympiad fosters pre-college computing through training, contests, and i

2010-08-20 19:34:00 564 1

原创 Section 1.2 Palindromic Squares

枚举并判断回文 { ID: yaoyuan4 PROG: palsquare LANG: PASCAL } Program palsquare; type   num = array[0..1000] of longint; const   inf = 'palsquare.in'; outf = 'palsquare.out'; var   n : longint;   a, b : num; Procedure in

2010-08-20 19:15:00 356

原创 Section 1.2 Name That Number

此题主要考察文件操作 由于数据量小 所以可以顺序查找 至于字母与数字的对应 可以直接打表 { ID: yaoyuan4 PROG: namenum LANG: PASCAL } Program namenum; const   inf = 'namenum.in'; outf = 'namenum.out'; txt = 'dict.txt';   a : array['A'..'Z'] of char = ('2', '2', '2', '3',

2010-08-20 15:09:00 301

原创 Section 1.2 Transformations

定义a是原始状态,b是改变后的状态。 右旋 b[j, n-i+1] ← a[i, j] 镜像 b[i, n-j+1] ← a[i, j] 找出规律是第一步 接下来就是枚举 当然USACO 细节超多 要慢慢解决 { ID: yaoyuan4 PROG: transform LANG: PASCAL } Program transform; type   pic = array[1..10, 1..10] of char; const   in

2010-08-20 03:07:00 251

原创 Section 1.2 Milking Cows

建立一个很大的布尔数组 然后在 挤奶的时间上赋上 true 最后 查找即可 注意 若挤奶的时间为 A B, 循环 应从 A to B-1 { ID: yaoyuan4 PROG: milk2 LANG: PASCAL } Program milk2; const   inf = 'milk2.in'; outf = 'milk2.out'; var   n, maxi, mini, ansi, ansx : longint;   f : a

2010-08-20 00:53:00 360

原创 Section 1.1 Broken Necklace

根据题意 数据结构明显是 双向链表 并且用双向链表 处理也很方便 过程init 用的就是 构造双向链表 接着就是 枚举从哪部分 断开 如果 出现 w, 就把w 赋为 他的前驱 或者 后继 { ID: yaoyuan4 PROG: beads LANG: PASCAL } Program beads; type   link = record    date : char;    next, prior : longint;   end;

2010-08-19 23:03:00 361

原创 Section 1.1 Greedy Gift Givers

仍然是只需根据条件进行模拟 定义记录people,表示人名 和 钱 定义函数find, 给定字符串 返回位置 此外注意 0 不能 做 除数 { ID: yaoyuan4 PROG: gift1 LANG: PASCAL } Program gift1; type   people = record    namei : string;    moneyi : longint;   end; const   inf = 'gi

2010-08-19 17:16:00 258

原创 Section 1.1 Your Ride Is Here

模拟 { ID: yaoyuan4 PROG: ride LANG: PASCAL } Program ride; const   yes = 'GO';   no = 'STAY';   inf = 'ride.in';   outf = 'ride.out'; var   flag : boolean;   x, y : string;   a : array['A'..'Z'] of longint; Pr

2010-08-19 11:31:00 348

原创 Section 1.1 Firday the Thirteenth

1990 、1、13 在 Saturday 用next 过程 计算下一个  13号 在 星期几 具体看程序 { ID: yaoyuan4 PROG: friday LANG: PASCAL } Program friday; const   mo : array[1..12] of longint =   (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); inf = 'friday.in'; o

2010-08-19 11:08:00 328

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除