第一题: 三国杀
题目简述
现在有两个人打牌,每个人有3种技能
- 杀:对对方使用,对方需要使用一张 闪 ,否则对方输掉游戏; 或 回应对方的 斩 ;
- 闪:回应对方的 杀 ;
- 斩:对对方使用,对方需要使用一张 杀 ,否则对方输掉游戏。
每个人都知道对方有多少张什么牌
第一个人有C1张杀、C2张闪、 C3张斩
第二个人有D1张杀、D2张闪、 D3张斩
问,在最优解且第一人是先手的情况下谁赢
题目分析
首先先考虑第一个人赢的情况,分别有两种:
- 第一个人的杀 > 第二个人的闪
- 第一个人的斩 > 第二个人的杀
转换为代码即为
if(C1 > D2 or C3 > D1) C赢第二个人赢的情况是
- 用自己的杀消完了第一个人的斩的数量 > 第一个人的闪
- 第二个人的斩比第一个人的杀多
转换为代码即为
else if(D1 - C3 > C2 or D3 > C1) D赢平局情况
else 平局::::success[正确代码]{close}
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t --) {
int a, b, c, d, e, f;
cin >> a >> b >> c >> d >> e >> f;
if (a > e or c > d) {
cout << "C" << endl;
} else if (d - c > b or f > a) {
cout << "D" << endl;
} else {
cout << "E" << endl;
}
}
}::::
第二题: 男生女生
题目简述
告诉你,有N个男生,M个女生,问怎么做可以做到尽量最优交叉站
题目分析
如果安排交叉站,有两种站法
- 男、女、男...
- 女、男、女...
怎么尽量交叉站?应该选择哪种队列呢?
我们拿出一个示例:
N = 4, M = 2
选择男女男:BGBGBB
选择女男女:GBGBBB
可以不用显微镜看出,男女男显然更好
也就是说,我们会尽量选择更多人的性别靠前站
::::success[正确代码]{close}
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
while (n > 0 and m > 0) {
if (n >= m) cout << "BG";
if (n < m) cout << "GB";
n --, m --;
}
while (n > 0) {
cout << "B";
n --;
}
while (m > 0) {
cout << "G";
m --;
}
return 0;
}::::
第三题: 电脑耗能计算
题目简述
告诉你,汤姆的笔记本电脑有三种模式,分别是
- 在 正常模式 下,笔记本电脑每分钟消耗 W1瓦特。
- 汤姆最后一次移动鼠标或触摸键盘 T1分钟后, 屏幕保护程序 启动,耗电量变为每分钟 W2瓦。
- 最后,在屏保启动 T2 分钟后,笔记本电脑切换到 睡眠 模式,每分钟耗电W3 瓦。如果汤姆在第二或第三模式下移动鼠标或触摸键盘,笔记本电脑就会切换到第一(正常)模式。
汤姆使用笔记本电脑的工作时间可分为 个时间段 。在每个时间段内,汤姆不断移动鼠标和按键盘上的按钮。在两个时间段之间,汤姆远离笔记本电脑。请计算 时间段内笔记本电脑消耗的总电量。
题目分析
这是典型的分段计费问题
对于正常模式的时间段,费用是W1/一分钟
对于屏保模式的时间段,费用是W2/一分钟
对于睡眠模式的时间段,费用是W3/一分钟
接着可以按照他写出代码
if (sub <= t1) sum += sub * p1;
else if (sub <= t1 + t2) sum += t1 * p1 + (sub - t1) * p2;
else sum += t1 * p1 + t2 * p2 + (sub - t1 - t2) * p3;注意,开始部分前面的部分不能算,例如我从20时间单位开始,就不需要算0~20这个时间段
::::success[正确代码]{close}
#include <bits/stdc++.h>
using namespace std;
const int N = 101;
int l[N], r[N];
int main() {
int n, p1, p2, p3, t1, t2;
cin >> n >> p1 >> p2 >> p3 >> t1 >> t2;
for (int i = 1; i <= n; i ++) cin >> l[i] >> r[i];
int sum = 0;
for (int i = 1; i <= n; i ++) {
sum += (r[i] - l[i]) * p1;
int sub = l[i] - r[i - 1];
if (i == 1) sub = 0;
if (sub <= t1) sum += sub * p1;
else if (sub <= t1 + t2) sum += t1 * p1 + (sub - t1) * p2;
else sum += t1 * p1 + t2 * p2 + (sub - t1 - t2) * p3;
}
cout << sum << endl;
return 0;
}::::