📜  usaco 2018 年 1 月竞赛 - Java (1)

📅  最后修改于: 2023-12-03 14:48:14.548000             🧑  作者: Mango

USACO 2018 年 1 月竞赛 - Java

USACO(美国信息学奥赛)是美国全国各州和地区举办的信息学比赛,考查学生的编程能力和算法设计能力。USACO 2018 年 1 月竞赛是一场针对初、中、高级学生的比赛,共计 4 个题目,需要使用 Java、C++、Python 等语言完成。

竞赛概述
  • 时间:2018 年 1 月 20-23 日
  • 地点:网上
  • 语言:Java、C++、Python 等多种语言
  • 题目数量:4 道题目
  • 难度等级:初、中、高级三个等级
题目描述
题目一:The Lost Cow

问题描述:

Bessie 要去参加比赛,但她不知道路怎么走,她要走到编号为 $x$ 的路口,但她不知道她现在在编号为 $y$ 的路口,她只知道如果她往右走,下一个路口的编号比当前编号大 $1$,如果她往左走,下一个路口的编号比当前编号小 $1$。请问她走多少步可以到达路口 $x$。

输入:

你需要输入两个整数 $x,y$,代表目的地与起点的路口编号。

输出:

输出一个整数,代表 Bessie 需要走的步数。

样例输入:

5 3

样例输出:

5

解题思路

由于题目的特殊性,我们可以将其分为两部分。

第一步是从位置 $y$ 向右走到 $x$。

第二步是从位置 $x$ 向左走回 $y$。

我们可以采用模拟的方法来模拟这个过程,最后计算出总步数。

题目二:Blocked Billboard

问题描述:

给定两个矩形 $A$ 和 $B$,矩形 $A$ 所在位置现在有一块广告牌,现在你需要确定是否这个广告牌被矩形 $B$ 完全遮挡。

输入:

第一行四个整数,分别代表矩形 $A$ 的左下角坐标和右上角坐标。

第二行四个整数,分别代表矩形 $B$ 的左下角坐标和右上角坐标。

输出:

输出 $0$ 或 $1$,表示矩形 $B$ 是否完全遮挡矩形 $A$。

样例输入:

0 0 4 4 1 1 3 3

样例输出:

0

解题思路

由于题目所给的矩形的坐标是二维平面中的坐标,因此可以采用二维数组的方式存储信息。接下来,我们需要考虑如何判断是否矩形 $B$ 遮住了矩形 $A$。

首先,我们可以通过计算矩形 $A$ 和矩形 $B$ 的面积,如果两个面积不相同,说明矩形 $B$ 一定没有完全遮住矩形 $A$。

其次,我们可以判断矩形 $A$ 中每个点是否被矩形 $B$ 遮住,如果所有的点都被遮住了,说明矩形 $B$ 完全遮挡了矩形 $A$。

题目三:Back and Forth

问题描述:

有两个篮子,第一个篮子中有 $n$ 只羊,第二个篮子中没有羊。现在你需要将这 $n$ 只羊从第一个篮子依次取出,放到另外一个篮子中。你可以进行一下两个操作:

  • 从第一个篮子中取出羊,放到第二个篮子中。
  • 从第二个篮子中取出羊,放到第一个篮子中。

之后,你需要得到所有可能的羊的数量。

输入:

第一行输入 $n$,表示第一个篮子中羊的数量 $(1 \leq n\leq10)$。

第二行输入 $n$ 个整数,表示第一个篮子的每只羊的数量。

输出:

输出一个升序排列的数组,表示所有可能的羊的数量。

样例输入:

3 1 2 3

样例输出:

2 3 4 5 6

解题思路

本题的解题思路比较简单,我们考虑模拟整个过程。首先需要将第一个篮子的羊进行排列组合,然后模拟所有可能的操作,将羊转移到第二个篮子中,并且记录下新篮子中羊的数量,最后将所有羊的数量进行升序排列输出即可。

题目四:Silver Pails

问题描述:

$n$ 个装满了水和奶的容器,每个容器都有一个编号 $1,2,3,...,n$。现在你需要将其中的一部分容器里的水先倒入另外一个容器里,然后再将其中的一部分容器里的水和奶混合后倒入某个容器中,最后询问使得容器里奶的数量最大是多少。

输入:

第一行输入三个整数 $n,m,t$,分别代表容器数量,第一次倒水操作数量和第二次倒水操作数量 $(1 \leq n \leq 1000, 1 \leq m,t \leq 100)$。

第二行输入 $n$ 个整数,分别代表每个容器装的奶的数量。

接下来 $m$ 行输入两个整数 $a,b$,表示从容器 $a$ 中往容器 $b$ 中倒水。

接下来 $t$ 行输入两个整数 $a,b$,表示从容器 $a$ 和 $b$ 中取出一部分水和奶混合后,倒入容器 $b$。

输出:

输出一个整数,表示使得容器里奶的数量最大值。

样例输入:

3 1 1 1 3 2 1 3 3 2 3 1

样例输出:

3

解题思路

首先对于第一个倒水操作,我们可以将其看成从一个容器向另外一个容器倒水,这里可以采用邻接矩阵的方式存储信息,具体的实现方式就是将矩阵中的某个元素赋值为 $1$。

对于第二个倒水操作,我们需要记录下新容器中混合后奶的数量,因此需要采用二维数组的方式记录信息。

接下来,我们需要枚举所有的可能情况,计算出最终结果。计算结果过程中需要注意一下,如果某个容器没有水和奶,那么这个容器就不要计算在内了。最后,输出最大奶的数量即可。