problem A.寻找大富翁
倒序排序后输出前m个
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//定义比较规则为倒序
bool compare(int a, int b) {
return a > b;
}
int main() {
int n = 0;
int m = 0;
while (1) {
vector<int> a;
cin >> n;
cin >> m;
if (m == 0 && n == 0) {
return 0;
}
for (int i = 0; i < n; i++) {
int num;
cin >> num;
a.push_back(num);
}
std::sort(a.begin(), a.end(), compare);
if (m > n) {
m = n;
}
for (int i = 0; i < m; i++) {
cout << a[i] << " ";
}
cout << endl;
}
return 0;
}
problomB.统计同成绩学生人数
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
while (1) {
int N;
int SearchNum;
int num = 0;
vector<int> a;
cin >> N;
if (N == 0) {
break;
}
for (int i = 0; i < N; i++) {
int num;
cin >> num;
a.push_back(num);
}
cin >> SearchNum;
for (int i = 0; i < N; i++) {
if (a[i] == SearchNum) {
num++;
}
}
cout << num << endl;
}
return 0;
}
problemC.魔术师排队
从最后一个向前遍历
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
using namespace std;
//遍历魔法师,从最后一个开始
int main() {
vector<int> a;
int n;
int maxnum;
int record = 0;
int num = 0;
cin >> n;
for (int i = 0; i < n; i++) {
int num;
cin >> num;
a.push_back(num);
}
maxnum = a[n-1];
for (int i = n - 2; i >= 0; i--) {
if (a[i] < maxnum) {
num++;
}
else {
maxnum = a[i];
}
}
cout << num << endl;
return 0;
}
problemD.五子棋
解题思路:
1.写出一个函数,检测是否存在5个连续的符号,其中包括横竖左右斜边
2.在主函数中调用该函数,分别检测白色棋子和黑色棋子
要点:使用了vector的二维数组
//解题思路:
//1.写出一个函数,检测是否存在5个连续的符号,其中包括横竖左右斜边
//2.在主函数中调用该函数,分别检测白色棋子和黑色棋子
//要点:使用了vector的二维数组
#include <iostream>
#include <vector>
using namespace std;
//检测是否有五个连续的同色棋子
int check_five(const vector<vector<char>>& board,int n, char color) {
int score = 0;
//横向检测
for (int i = 0; i < n; i++) {
for (int j = 0; j <= n - 5; j++) {
if (board[i][j] == color && board[i][j + 1] == color && board[i][j + 2] == color && board[i][j + 3] == color && board[i][j + 4] == color) {
score++;
}
}
}
//纵向检测
for (int j = 0; j < n; j++) {
for (int i = 0; i <= n - 5; i++) {
if (board[i][j] == color && board[i + 1][j] == color && board[i + 2][j] == color && board[i + 3][j] == color && board[i + 4][j] == color) {
score++;
}
}
}
//左斜边方向检测
for (int i = 0; i <= n - 5; i++) {
for (int j = 0; j <= n - 5; j++) {
bool is_five = true;
for (int k = 0; k < 5; k++) {
if (board[i + k][j + k] != color) {
is_five = false;
break;
}
}
if (is_five) score++;
}
}
//右斜边方向检测
for (int i = 0; i <= n - 5; i++) {
for (int j = 4; j < n; j++) {
bool is_five = true;
for (int k = 0; k < 5; k++) {
if (board[i + k][j - k] != color) {
is_five = false;
break;
}
}
if (is_five) score++;
}
}
return score;
}
int main() {
int n;
cin >> n;
//vector二维字符型数组表示,n代表n行,vector<char> (n)表示每行的数据类型依然是vector,每行有n个数据
vector<vector<char>> board(n, vector<char> (n));
//输入棋盘数据
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cin >> board[i][j];
}
//分别计算黑色和白色得分
int black_score = check_five(board, n, 'B');
int white_score = check_five(board, n, 'W');
cout << black_score << ' ' << white_score << endl;
return 0;
}
problemE.约瑟夫环
//以下为方法一,答案正确但是运行超时
#include <iostream>
#include <vector>
using namespace std;
int main() {
long long n; // 总人数
long long k; // 报到k的人被移除
long long m = 0; // 报数计数器,从1开始
long long count = 0; // 记录第1个人报数的次数
// 输入n和k的值
cin >> n;
cin >> k;
// 创建一个大小为n的数组a,用来表示每个人是否已被移除
vector<long long> a(n); // 初始化一个n大小的向量,默认所有元素为0,表示还未被移除
// 初始化数组,将所有人标记为未移除
for (long long i = 0; i < n; i++) {
a[i] = 0; // 0表示未移除,1表示已移除
}
// 开始模拟报数的过程
while (1) {
for (long long i = 0; i < n; i++) {
// 若此人未移除,则报数,向后移动一位
if (a[i] != 1) {
m++;
}
// 如果当前报数达到k,移除当前的人
if (m == k) {
a[i] = 1; // 标记当前人已被移除
m = 0; //m重新置为0
}
}
count++;
if (a[0] == 1) {
break;
}
}
// 输出第1个人被移除前报数的次数
cout << count << endl;
return 0;
}
方法二:使用list容器
//方法2.使用list容器,但是超过存储限制
#include <iostream>
#include <list>
using namespace std;
int main() {
long long n; // 总人数
long long k; // 报到k的人被移除
long long m = 0; // 报数计数器,从1开始
long long count = 0; // 记录第1个人报数的次数
// 输入n和k的值
cin >> n;
cin >> k;
// 创建一个list,用来表示每个人是否已被移除
list<long long> people;
// 初始化链表,将所有人加入list
for (long long i = 0; i < n; i++) {
people.push_back(i); // 用索引表示每个人
}
auto it = people.begin(); // 报数的起始位置
// 开始模拟报数的过程
while (1) {
for (auto iter = people.begin(); iter != people.end();) {
// 每个未移除的人报数
m++;
// 如果当前报数达到k,移除当前的人
if (m == k) {
// 如果是第一个人被移除,输出结果并退出
if (*iter == 0) {
cout << count + 1 << endl;
return 0;
}
// 删除当前人并重置报数计数器
iter = people.erase(iter);
m = 0; // 报数器重置
}
else {
// 若未到k,移动到下一个人
iter++;
}
}
count++;
}
return 0;
}