第一题: 三国杀

题目简述

现在有两个人打牌,每个人有3种技能

第一个人有C1张杀、C2张闪、 C3张斩
第二个人有D1张杀、D2张闪、 D3张斩

问,在最优解且第一人是先手的情况下谁赢

题目分析

首先先考虑第一个人赢的情况,分别有两种:

  1. 第一个人的杀 > 第二个人的闪
  2. 第一个人的斩 > 第二个人的杀
    转换为代码即为
if(C1 > D2 or C3 > D1) C赢

第二个人赢的情况是

  1. 用自己的杀消完了第一个人的斩的数量 > 第一个人的闪
  2. 第二个人的斩比第一个人的杀多
    转换为代码即为
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/一分钟
对于屏保模式的时间段,费用是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;
}

::::