算法题CCF CSP第二题练习(更新中)

Posted joeyzhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题CCF CSP第二题练习(更新中)相关的知识,希望对你有一定的参考价值。

/*
试题编号:201912-2
试题名称:回收站选址
题目描述:
通过无人机航拍我们已经知晓了n处尚待清理的垃圾位置,其中第i(1<=i<=n)处的坐标为(xi,yi),保证所有的坐标均为整数。
我们希望在垃圾集中的地方建立些回收站。具体来说,对于一个位置(x,y)是否适合建立回收站,我们主要考虑以下几点:
·(x,y)必须是整数坐标,且该处存在垃圾;
·上下左右四个邻居位置,即(x,y+1)、(x,y-1)、(x+1,y)和(x-1,y)处,必须全部存在垃圾;
·进一步地,我们会对满足上述两个条件的选址进行评分,分数为不大于4的自然数,表示在(x±1,y±1)四个对角位置中有几处存在垃圾。
现在,请你统计一下每种得分的选址个数。
*/

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std; 

class data
{
public:
    int x,y,n = -1;
};

int main()
{
    int n, x, y, cnt1, cnt2, out[5]{0};
    vector<data> dat;
    cin >> n;
    dat.reserve(n);
    for (int i = 0; i < n; ++i)
    {
        data d;
        cin >> d.x >> d.y;
        dat.push_back(d);
    }
    
    for (auto& i: dat)
    {
        cnt1 = 0;
        cnt2 = 0;
        for (auto j: dat)
        {
            if(i.x == j.x && abs(i.y - j.y) == 1)
                cnt1++;
            else if(i.y == j.y && abs(i.x - j.x) == 1)
                cnt1++;
            else if(abs(i.x - j.x) == 1 && abs(i.y - j.y) == 1)
                cnt2++;
        }
        if (cnt1 == 4)
        {
            i.n == cnt2;
            out[cnt2]++;
        }
    }
    cout << out[0] << endl << out[1] << endl << out[2] << endl << out[3] << endl << out[4];
    return 0;
}

 

/*
试题编号:    201909-1
试题名称:    小明种苹果
题目描述
小明在他的果园里种了一些苹果树。为了保证苹果的品质,在种植过程中要进行若干轮疏果操作,也就是提前从树上把不好的苹果去掉。
第一轮疏果操作开始前,小明记录了每棵树上苹果的个数。每轮疏果操作时,小明都记录了从每棵树上去掉的苹果个数。
在最后一轮疏果操作结束后,请帮助小明统计相关的信息。
*/ #include <iostream> #include <vector> using namespace std; int main() { int turns, treeNum, appleNum, T{0}, D{0}, E{0}; cin >> treeNum; vector<int> drop(treeNum, 0); for (int i = 0; i < treeNum; ++i) { vector<int> vt; cin >> turns; vt.resize(turns+1); vt[0] = turns; for (int j = 1; j <= turns; ++j) cin >> vt[j]; appleNum = vt[1]; for (int k = 2; k <= turns; ++k) { if (vt[k] <= 0) { appleNum += vt[k]; } else { drop[i] += appleNum - vt[k]; appleNum = vt[k]; } } T += appleNum; } for (int i = 0; i < treeNum; ++i) { if (drop[i] > 0) D++; if (drop[i] > 0 && drop[(i+1)%treeNum] > 0 && drop[(i+treeNum-1)%treeNum] > 0) E++; } cout << T << << D << << E; return 0; }

 

/*
试题编号:201903-2
试题名称:二十四点
【题目描述】
定义每一个游戏由4个从1-9的数字和3个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,
运算顺序按照四则运算顺序进行。其中加法用符号+表示,减法用符号-表示,乘法用小写字母x表示,除法用符号/表示。
在游戏里除法为整除,例如2/3=0,3/2=1,4/2=2。 老师给了你n个游戏的解,请你编写程序验证每个游戏的结果是否为24。
*/ #include <iostream> #include <stack> using namespace std; void culculate(stack<int> &nums, stack<char> &ops, bool tag) { int num2{nums.top()}; nums.pop(); int num1{nums.top()}; nums.pop(); int result; char op{ops.top()}; ops.pop(); switch(op) { case +: result = num1 + num2; break; case -: tag ? result = num1 - num2 : result = num2 - num1; break; case x: result = num1 * num2; break; case /: result = num1 / num2; break; } nums.push(result); } inline int priority(char op) { if (op == + || op == -) return 1; else return 2; } int main() { string input; int n, result; stack<char> ops, ops2; stack<int> nums, nums2; cin >> n; for (int i = 0; i < n; ++i) { cin >> input; for (int i = 0; i < 7; ++i) { if (i % 2 == 0) { nums.push(input[i] - 0); if (!ops.empty() && priority(ops.top()) == 2) culculate(nums, ops, true); } else ops.push(input[i]); } while(!ops.empty()) { ops2.push(ops.top()); ops.pop(); } while(!nums.empty()) { nums2.push(nums.top()); nums.pop(); } while(!ops2.empty()) culculate(nums2, ops2, false); result = nums2.top(); nums2.pop(); if (result == 24) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }

 

以上是关于算法题CCF CSP第二题练习(更新中)的主要内容,如果未能解决你的问题,请参考以下文章

CCF CSP 202109赛题练习

CCF CSP-2021-04 赛题练习

CCF CSP-2022-01 赛题练习

算法题CCF CSP 1403-1

记第十七次CCF CSP认证

CCF-CSP 202209 赛题练习