CCF 201912-1报数 CCF 201912-2 回收站选址

CCF 201912-1报数

CCF 201912-1报数 CCF 201912-2 回收站选址_第1张图片

思路:

题目描述比较清晰,类似于海大986(原977)计算机技术初试题目猴子报数选大王。
注意题目是报n个数,而不是报到n结束,即7的倍数或含有数字7不计入n。

代码实现:

#include 
#include 
#include 

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 回收站选址

CCF 201912-1报数 CCF 201912-2 回收站选址_第2张图片

思路:

给定n个点的坐标(n个垃圾点),从这n个点中选取符合条件的点作为垃圾回收站,即:本身点有垃圾,且上下左右四个点也有垃圾。随后我们对符合建立垃圾回收站的点赋分,分值为四个对角含有垃圾点的数量,即最大值为4,最小值为0。输出为每种分值有多少个垃圾回收站,即输出5个数。

代码实现:

#include 
#include 
#include 

#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;
}

CCF 201912-1报数 CCF 201912-2 回收站选址_第3张图片

你可能感兴趣的:(CCF代码每日一练,c++,算法)