1、关羽过关斩三将
题目
输入四个人的武力值(大于0小于50),若超过界限需要重新输入,关羽的武力值x,将士武力值为y,满足(x-y)*(x-y)+(x-y)+41 若为素数则关羽获胜,若关羽三次获胜输出WIN,若失败则输出失败的将领序号(第几关)。
输入样例:
40 20 30 20
输出样例:
WIN
cpp
#include<iostream>
using namespace std;
bool isprime(int n) {
if (n < 2) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
int main() {
int x, y[3];
// 输入关羽武力值,确保在(0,50)内
do {
cin >> x;
if (x <= 0 || x >= 50)
cout << "武力值需大于0且小于50,请重新输入关羽的武力值:";
} while (x <= 0 || x >= 50);
// 输入三个将士武力值
for (int i = 0; i < 3; i++) {
do {
cin >> y[i];
if (y[i] <= 0 || y[i] >= 50)
cout << "武力值需大于0且小于50,请重新输入第" << i+1 << "个将士的武力值:";
} while (y[i] <= 0 || y[i] >= 50);
}
int winCount = 0;
for (int i = 0; i < 3; i++) {
int ans = (x - y[i]) * (x - y[i]) + (x - y[i]) + 41;
if (isprime(ans)) {
winCount++;
} else {
cout << i + 1 << endl; // 输出关卡序号(从1开始)
return 0; // 一旦失败即可退出,无需继续判断
}
}
if (winCount == 3) cout << "WIN" << endl;
return 0;
}
2、员工上班
题目
输入N个员工,每个员工输出ID号,上班时间,下班时间,第一行输出最早去的员工的ID和上班时间第二行输出最迟走的员工的ID和下班时间第三行输出工作最久的员工的ID和上班时间
输入格式:
第一行输入N表示有N个员工,在接下来的N行,依次输入员工ID,上班打卡时间,下班打卡时间。
输出格式:
在接下来的三行依次输出最早来的员工ID,上班时间。最迟走的员工ID,下班时间。工作时间最久的员工ID和上班时长。
输入样例:
3
ID100001 07:00:00 17:00:00
ID100002 08:00:00 18:00:00
ID100003 09:00:00 21:00:00
输出样例:
ID100001 07:00:00
ID100003 21:00:00
ID100003 12:00:00
cpp
#include <iostream>
#include <string>
#include <vector>
#include <cstdio> // 用于 sprintf
using namespace std;
// 将 "HH:MM:SS" 格式的时间转换为秒数
int toSeconds(const string& t) {
int h = (t[0] - '0') * 10 + (t[1] - '0');
int m = (t[3] - '0') * 10 + (t[4] - '0');
int s = (t[6] - '0') * 10 + (t[7] - '0');
return h * 3600 + m * 60 + s;
}
// 将秒数转换为 "HH:MM:SS" 格式的字符串
string toTimeStr(int sec) {
int h = sec / 3600;
int m = (sec % 3600) / 60;
int s = sec % 60;
char buf[9];
sprintf(buf, "%02d:%02d:%02d", h, m, s);
return string(buf);
}
int main() {
int N;
cin >> N; // 输入员工人数
string earliest_id, latest_id, longest_id;
string earliest_time = "23:59:59"; // 初始化为最晚时间
string latest_time = "00:00:00"; // 初始化为最早时间
int max_duration = -1; // 初始化为负数,确保第一次更新
for (int i = 0; i < N; i++) {
string id, t1, t2;
cin >> id >> t1 >> t2;
// 最早来的员工(上班时间最早)
if (t1 < earliest_time) {
earliest_time = t1;
earliest_id = id;
}
// 最迟走的员工(下班时间最晚)
if (t2 > latest_time) {
latest_time = t2;
latest_id = id;
}
// 工作时间最久的员工(工作时间最长)
int duration = toSeconds(t2) - toSeconds(t1);
if (duration > max_duration) {
max_duration = duration;
longest_id = id;
}
}
// 输出结果
cout << earliest_id << " " << earliest_time << endl;
cout << latest_id << " " << latest_time << endl;
cout << longest_id << " " << toTimeStr(max_duration) << endl;
return 0;
}
3、最大模版数
题目
有一个M*N的材料和一个S*T的模板,从材料中切除模板,求最大能切出来的模板数量。
输入格式:
第一行 M N
下面的M行N列:材料的具体内容
第M+2行: S T
下面的S行T列:模板材料的具体内容
输出格式:
最大能切出来的模板数量
Sample input:
3 4
a b c d
c d a b
a c c d
2 2
a b
c d
Sample out:
2
cpp
#include<iostream>
using namespace std;
const int N = 1e3;
int m, n, s, t;
char maze[N][N], graph[N][N];
bool used[N][N]; // 标记格子是否已被切除
// 判断以 (x,y) 为左上角的子矩阵是否与模板匹配
bool match(int x, int y) {
for (int i = 0; i < s; i++) {
for (int j = 0; j < t; j++) {
if (maze[x + i][y + j] != graph[i][j])
return false;
}
}
return true;
}
int main() {
cin >> m >> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> maze[i][j];
used[i][j] = false;
}
}
cin >> s >> t;
for (int i = 0; i < s; i++) {
for (int j = 0; j < t; j++) {
cin >> graph[i][j];
}
}
int cnt = 0;
// 按行优先遍历所有可能的左上角
for (int i = 0; i <= m - s; i++) {
for (int j = 0; j <= n - t; j++) {
// 检查该区域是否已被占用
bool occupied = false;
for (int ii = 0; ii < s; ii++) {
for (int jj = 0; jj < t; jj++) {
if (used[i + ii][j + jj]) {
occupied = true;
break;
}
}
if (occupied) break;
}
if (occupied) continue; // 区域已被切掉,跳过
// 检查是否匹配模板
if (match(i, j)) {
cnt++;
// 标记该区域为已用
for (int ii = 0; ii < s; ii++) {
for (int jj = 0; jj < t; jj++) {
used[i + ii][j + jj] = true;
}
}
}
}
}
cout << cnt << endl;
return 0;
}