[LGR-233-Div.4]洛谷入门赛#37——8道题题解
大家好,我是Zac。不知道各位氪官有木有参加昨天晚上的洛谷入门赛,如果参加了的话,欢迎各位神犇小伙伴们把自己的排名打在评论区~(反正本蒟蒻排名570,最后一道题点上提交键了结果21:00了qwq)
T1 季风
题目描述
已是夏季,S 市刮起了季风。N 大学环境学院对某日的季风进行了监测,监测结果为两个非零整数 a,b。
- a 表示在南北方向上的风速,若 a>0 则表示刮风速为 a 米每秒的北风,若 a<0 则表示刮风速为 −a 米每秒的南风。
- b 表示在东西方向上的风速,若 b>0 则表示刮风速为 b 米每秒的东风,若 b<0 则表示刮风速为 −b 米每秒的西风。
请你判断季风的实际方向,具体地:
- 若在南北方向上刮北风,东西方向上刮东风,则实际方向为东北,输出
NorthEast
。 - 若在南北方向上刮北风,东西方向上刮西风,则实际方向为西北,输出
NorthWest
。 - 若在南北方向上刮南风,东西方向上刮东风,则实际方向为东南,输出
SouthEast
。 - 若在南北方向上刮南风,东西方向上刮西风,则实际方向为西南,输出
SouthWest
。
输入格式
输入一行两个用空格分隔的非零整数 a,b。
输出格式
输出一行一个字符串,表示季风的方向。字符串的格式如【题目描述】中所述。
输入输出样例
输入 #1
1 2
输出 #1
NorthEast
输入 #2
-20 20
输出 #2
SouthEast
说明/提示
样例 1 解释
由于 a>0,则在南北方向上刮北风;由于 b>0,则在东西方向上刮东风。
因此实际方向为东北,输出 NorthEast
。
数据范围与约定
对于全部数据,满足 1≤∣a∣,∣b∣≤20。
其中,∣x∣ 代表 x 的绝对值,即,将 x 的符号去掉后得到的非负值。如果 x 是正数和 0,∣x∣=x;如果 x 是负数,∣x∣=−x。
思路:
这道题其实是一道水题,只要你找到了方法。
题目要求根据给定的两个非零整数a和b来判断季风的方向。
根据题目描述:
- a表示南北方向:a>0为北风(风速a米/秒),a<0为南风(风速|a|米/秒,但方向是南)。
- b表示东西方向:b>0为东风(风速b米/秒),b<0为西风(风速|b|米/秒,方向是西)。
实际方向由南北和东西方向的组合决定:
北风 + 东风 -> 东北(NorthEast)
北风 + 西风 -> 西北(Northwest)
南风 + 东风 -> 东南(Southeast)
南风 + 西风 -> 西南(Southwest)
注意:题目明确a和b都是非零整数,所以不需要考虑为零的情况。
因此,我们可以根据a和b的正负来组合:
a>0 表示北风,a<0 表示南风。
b>0 表示东风,b<0 表示西风。
具体判断:
如果a为正,b为正,输出"NorthEast"
如果a为正,b为负,输出"Northwest"
如果a为负,b为正,输出"Southeast"
如果a为负,b为负,输出"Southwest"
所以,我们只需要取这四个字符中的一个即可,也就是先判断南北方向,再分别判断东西方向。
AC Code:
#include <iostream>
using namespace std;
int main() {int a, b;cin >> a >> b;if (a > 0) {if (b > 0) {cout << "NorthEast";} else {cout << "NorthWest";}} else {if (b > 0) {cout << "SouthEast";} else {cout << "SouthWest";}}return 0;
}
T2 购票
题目描述
H 市 W 公园的门票分为单次票和年票,单次票的售价为 a 元,年票的售价为 b 元。若购买年票,则可以在今年无限次进入公园。
今年你想去 n 次 W 公园,你最少要花多少钱购买门票?
输入格式
输入一行三个由空格分隔的非负整数 n,a,b。
输出格式
输出一行一个整数,表示购买门票的最少花费。
输入输出样例
输入 #1
100 1 50
输出 #1
50
输入 #2
2 10 50
输出 #2
20
输入 #3复制
987654321 123456789 999999999999999999
输出 #3复制
121932631112635269
输入 #4复制
0 100 200
输出 #4复制
0
说明/提示
样例 1 解释
如果购买单次门票,则总花费为 100×1=100 元。
如果购买年票,则总花费为 50 元。
因此购买年票可以使总花费最少,最少花费为 50 元。
样例 2 解释
如果购买单次门票,则总花费为 2×10=20 元。
如果购买年票,则总花费为 50 元。
因此购买单次门票可以使总花费最少,最少花费为 20 元。
样例 3 解释
请注意答案可能超过 int
类型所能表示的范围。
样例 4 解释
输入的数据中可能含有 0。
数据范围与约定
对于全部数据,满足 0≤a,b,n≤1018。各测试点的详细数据范围见下表。
测试点 | 特殊性质 |
---|---|
1∼12 | 0≤a,b,n≤104 |
13∼16 | 0≤a,b,n≤109 |
17∼20 | 无 |
思路
这道题其实是一道水题,只要你找到了方法。
题目描述:
小G有一排n台抽奖机,从第1台开始依次游玩。初始积分x。
对于第i台抽奖机,需要a_i积分才能玩,玩完后获得b_i积分(注意:玩之前需要满足当前积分>=a_i,玩之后积分变化:当前积分 = 当前积分 - a_i + b_i)。
游玩规则:
1. 从第1台开始,依次游玩。
2. 在游玩第i台之前,如果当前积分 < a_i,则停止游玩(并且不再游玩后面的)。
3. 在游玩第i台之后,如果当前积分 >= y,则停止游玩(不再游玩后面的)。
给定n, x, y,以及每台抽奖机的a_i和b_i,求小G停止游玩后拥有的积分数量。
输入格式:
第一行:n, x, y 接下来n行:每行两个正整数a_i, b_i 输出格式: 一个整数,表示最终积分。
注意:游玩是依次进行的,可能因为不够钱玩下一台而停止,也可能因为达到y分而提前停止。
示例:
假设n=2, x=10, y=100。
第一台:a1=5, b1=10 -> 游玩前10>=5,可以玩,玩后积分=10-5+10=15
第二台:a2=10, b2=100 -> 游玩前15>=10,可以玩,玩后积分=15-10+100=105,然后105>=y(100),停止。所以输出105。
另一种情况:
n=2, x=10, y=100 。
第一台:a1=5, b1=10 -> 玩后15
第二台:a2=20, b2=100 -> 当前15<20,所以不能玩第二台,停止。最终积分15。
因此,我们需要模拟过程:
当前积分 = x 从第一台到第n台,依次判断:
如果当前积分 < a_i:则停止,输出当前积分。
否则,玩这台抽奖机:当前积分 = 当前积分 - a_i + b_i
然后判断当前积分是否>=y,如果是,则停止,输出当前积分。
如果所有机器都玩完了,则输出最后的积分。
注意:题目要求是依次游玩,并且每台只能玩一次。
由于n最大是10^18,我们可以使用循环模拟。
代码步骤:
1. 读入n, x, y。
2. 用循环读入n组a_i和b_i,可以存储到两个数组,或者直接边读边处理(因为不需要重复使用,而且顺序处理)。
3. 初始化当前积分cur = x。
4. 遍历每一台抽奖机(i从0到n-1):
if cur < a_i: 则break跳出循环。
else: cur = cur - a_i + b_i
if cur >= y: break跳出循环
5. 输出cur。
但是注意:题目中在游玩后如果积分>=y则停止,所以先判断是否满足条件再决定是否继续。
考虑边界:可能一台都不能玩,那么直接输出x。
例如:n=1, x=0, a1=10 -> 不能玩,输出0。 因此,我们按上述模拟。
AC code:
#include <iostream>
using namespace std;
int main() {long long n, a, b;cin >> n >> a >> b;if (a * n > b) {cout << b << endl;} else {cout << a * n << endl;}return 0;
}
T3 百万富翁