文章目录
C++ 洛谷入门赛 #14 题解 (Div#4)
前置知识:
- abs / min / max函数
不要看不起小函数,会后悔的 - bitset(如果你也不喜欢用bool数组)
array - set
- puts / putchar
- 问号表达式
A. 数字判断
题目描述
给定三个整数 a , b , c a, b, c a,b,c,请你判断它们是否满足如下所有条件:
- a + b + c ≤ 100 a + b + c \leq 100 a+b+c≤100。
- b b b 是 5 5 5 的倍数。
- c c c 是 7 7 7 的倍数。
- a − b > b − c a - b > b - c a−b>b−c。
如果上述条件均满足,请输出 Yes \texttt{Yes} Yes,否则输出 No \texttt{No} No。输入格式
输入只有一行三个整数,依次表示 a , b , c a,b,c a,b,c。
输出格式
输出一行一个字符串表示答案。
样例 #1
样例输入 #1
50 10 7
样例输出 #1
Yes
样例 #2
样例输入 #2
100 100 100
样例输出 #2
No
提示
数据规模与约定
本题采用捆绑测试,只有通过全部测试点才能获得分数。
对全部的测试点,保证 0 ≤ a , b , c < 2 31 0 \leq a, b, c < 2^{31} 0≤a,b,c<231。
分析
仔细阅读题目范围
注意题目只 保证 0 <= a, b, c <= 2^31
,乍一看没有任何问题,顺手一个int
然而……
当任意两个变量到达 2 31 2^{31} 231时。。。
code
#include <cstdio>
#define ll long long
int main() {
ll a, b, c;
scanf("%lld%lld%lld", &a, &b, &c);
puts(a + b + c <= 100 && b % 5 == 0 && c % 7 == 0 && a - b > b - c ? "Yes" : "No");
}
B. 团伙首领
题目描述
某 E 正在机房值班,小朋友吵得她头晕脑胀,她将 N N N 名吵闹的小朋友带出了机房,依次编号为 1 , 2 , ⋯ , N 1,2,\cdots,N 1,2,⋯,N。
某 E 发现,这些小朋友形成了若干个小团伙,每个小朋友属于且只属于一个小团伙。她要求每一名小朋友指出自己所在小团伙的首领编号,第 i i i
名小朋友指认的首领编号为 S i S_i Si。假定所有小朋友都没有说谎,请问这 N N N 名小朋友中一共形成了多少个小团伙?
输入格式
输入共两行。
输入的第一行为一个正整数 N N N。
输入的第二行为 N N N 个正整数,第 i i i 个为 S i S_i Si。
输出格式
输出一行一个整数,代表机房里小团体的数目。
样例 #1
样例输入 #1
5 1 1 3 4 1
样例输出 #1
3
提示
数据规模与约定
- 对于 30 % 30\% 30% 的测试数据,每个小团体有且只有一个人。
- 对于 100 % 100\% 100% 的测试数据, N ≤ 1 0 6 N \le10^6 N≤106, 1 ≤ S i ≤ N 1 \leq S_i \leq N 1≤Si≤N。数据保证有解且合法,即每个小朋友都真实地指认了 ta 所在团伙的首领。
分析
仔细阅读题目范围
好像并没有坑……
code
#include <cstdio>
#include <set>
std::set<int>s;
int main() {
int n, s;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &s);
::s.insert(s);
}
printf("%d", (int)::s.size());
}
C. 枚举结构
题目描述
D-- 是 2077 年的一种新兴语言。在 D-- 语言中,引入了一种「枚举结构」。具体的,这一种结构可以使用以下表达式表示:
X Y Z W
其中, X , Z X, Z X,Z 为单个小写字母,代表变量名; Y , W Y, W Y,W 为整数,代表枚举的起始值和终止值。其代表,将变量 X X X 从 Y Y Y 枚举到
W W W。由于 D-- 追求极致的安全性,因此为了进行确认,如果想要成功对 X X X 变量进行枚举,那么 Z Z Z 必须与 X X X 相同。
例如,一个合法的枚举结构表达式如下:
i 1 i 100
其代表,将 i i i 变量从 1 1 1 枚举到 100 100 100。
现在你收到了一个 D-- 枚举结构表达式
X Y Z W
,请你判断和计算以下内容:
表达式的合法性 一个枚举结构表达式,只有满足以下全部条件,方可算作合法:
- X X X 与 Z Z Z 均为小写字母。
- X X X 与 Z Z Z 相同。
- Y Y Y 与 W W W 均为整数。在给定的表达式中,我们保证这一条总是成立。
如果合法,表达式将枚举的次数 对于一个合法的枚举表达式,如果 Y ≤ W Y \le W Y≤W,其将会枚举 W − Y + 1 W - Y + 1 W−Y+1 次;否则,其将会枚举 Y − W + 1 Y - W + 1 Y−W+1 次。
输入格式
输入共一行一个表达式
X Y Z W
,其中 X , Z X,Z X,Z 为单个大小写字母或一位数字, Y , W Y, W Y,W 为整数。输出格式
输出共两行。
第一行为一个字符串。如果给定的表达式合法,输出
valid
;否则输出Invalid
。
第二行为一个整数,如果给定的表达式不合法,输出 − 1 -1 −1;否则输出表达式的枚举次数。样例 #1
样例输入 #1
i 1 i 100
样例输出 #1
valid 100
样例 #2
样例输入 #2
I 1 j 100
样例输出 #2
Invalid -1
提示
数据规模与约定
对于一个表达式 X Y Z W X Y Z W XYZW,对于 100 % 100\% 100% 的数据, − 2 × 1 0 9 ≤ Y , W ≤ 2 × 1 0 9 -2 \times 10 ^ 9 \leq Y, W \leq 2 \times 10 ^ 9 −2×109≤Y,W≤2×109</