CCF 201912-1报数
思路:
题目描述比较清晰,类似于海大986(原977)计算机技术初试题目猴子报数选大王。
注意题目是报n个数,而不是报到n结束,即7的倍数或含有数字7不计入n。
代码实现:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int ans[4];//4个人
int main()
{
int n;
cin >> n;
int k = 0, i = -1;//i表示第几个人
while (n)
{
i++;
k++;//从0开始报数
//被7整除,或包含数字7,to_string表示将数字k转换为字符串k
if (k % 7 == 0 || to_string(k).find('7') != -1) ans[i % 4] ++;
else n--;//报的总数
}
for (int i = 0; i < 4; i++) cout << ans[i] << endl;
return 0;
}
CCF 201912-2 回收站选址
思路:
给定n个点的坐标(n个垃圾点),从这n个点中选取符合条件的点作为垃圾回收站,即:本身点有垃圾,且上下左右四个点也有垃圾。随后我们对符合建立垃圾回收站的点赋分,分值为四个对角含有垃圾点的数量,即最大值为4,最小值为0。输出为每种分值有多少个垃圾回收站,即输出5个数。
代码实现:
#include <iostream>
#include <cstring>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 1010;
int n;
PII q[N];
int ans[5];//5种得分
//8个方向的偏移量
int dx[8] = { -1, -1, -1, 0, 1, 1, 1, 0 };
int dy[8] = { -1, 0, 1, 1, 1, 0, -1, -1 };
int main()
{
cin >> n;
//读入n个点
for (int i = 0; i < n; i++) cin >> q[i].x >> q[i].y;
//枚举n个点作为垃圾回收站是否符合
for (int i = 0; i < n; i++)
{
int s[8] = { 0 };//周围8个方向垃圾的数量
for (int j = 0; j < n; j++)
for (int k = 0; k < 8; k++)
//判断第k个方向是否存在垃圾点
if (q[i].x + dx[k] == q[j].x && q[i].y + dy[k] == q[j].y)
s[k] ++;
//上下左右四个方向若存在垃圾点则符合作为垃圾回收站的条件
if (s[1] && s[3] && s[5] && s[7])
//找到对应分值的位置累加,即4个对角存在垃圾点的数量
ans[s[0] + s[2] + s[4] + s[6]] ++;
}
for (int i = 0; i < 5; i++) cout << ans[i] << endl;
return 0;
}