【算法题】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;
}

原文地址:https://www.cnblogs.com/joeyzhao/p/12286337.html

时间: 2024-07-29 14:06:31

【算法题】CCF CSP第二题练习(更新中)的相关文章

经典算法题每日演练——第二题 五家共井

原文:经典算法题每日演练--第二题 五家共井 古代数学巨著<九章算数>中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠:乙三绠不足,如丙一绠: 丙四绠不足,如丁一绠:丁五绠不足,如戊一绠:戊六绠不足,如甲一绠,皆及. 意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水:乙家的绳子用三条不够,还要再用丙家的绳子 一条才能打到井水:丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水:丁家的绳子用五条不够,还要再用戊家的绳子一条才能打

Hadoop自测题及参考答案(持续更新中--2015.6.14)

单选题 1.与其他几项不同的是 A. Mesos B. Mongodb C. Corona D. Borg E. YARN 注:其他几项都是资源统一管理系统或者资源统一调度系统,而 Mongodb一种非关系型数据库. 2.[java基础] 以下不属于线程安全的数据结构是 A. HashMap B. HashTable C. CopyOnWriteArrayList D. ConcurrentHashMap 3.hadoop2.x采用什么技术构建源代码 A. ant B. ivy C. maven

Hadoop自测题及参考答案(持续更新中--2015.6.15)

与其他几项不同的是 A. Mesos B. Mongodb C. Corona D. Borg E. YARN注:其他几项都是资源统一管理系统或者资源统一调度系统,而 Mongodb一种非关系型数据库.2.[java基础] 以下不属于线程安全的数据结构是 A. HashMap B. HashTable C. CopyOnWriteArrayList D. Concur... www.worlduc.com/blog2012.aspx?bid=34337742 www.worlduc.com/bl

C#和.Ne学习第二天(更新中……)

1、注释符作用:1)、注销2)、解释2、C#中3种注释符1):单选注释//注释的内容例: //Console.WriteLine("hello"); 2):单行注释/*注释的内容*/例: 1 /*Console.WriteLine("hello"); 2 Console.ReadK

经典算法题每日演练——第二十题 三元组

原文:经典算法题每日演练--第二十题 三元组 我们知道矩阵是一个非常强大的数据结构,在动态规划以及各种图论算法上都有广泛的应用,当然矩阵有着不足的地方就是空间和时间 复杂度都维持在N2上,比如1w个数字建立一个矩阵,在内存中会占用1w*1w=1亿的类型空间,这时就会遇到outofmemory...那么面 临的一个问题就是如何来压缩矩阵,当然压缩的方式有很多种,这里就介绍一个顺序表的压缩方式:三元组. 一:三元组 有时候我们的矩阵中只有零星的一些非零元素,其余的都是零元素,那么我们称之为稀疏矩阵,

经典算法题每日演练——第二十四题 梳排序

原文:经典算法题每日演练--第二十四题 梳排序 这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点. 上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同样这里的梳排序也是在冒泡排序上做了一些优化. 冒泡排序上我们的选择是相邻的两个数做比较,就是他们的gap为1,其实梳排序提出了不同的观点,如果将这里的gap设置为一定的大小, 效率反而必gap=1要高效的多. 下面我们看看具体思想,梳排序有这样一个1.

经典算法题每日演练——第二十二题 奇偶排序

原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个“奇偶排序”说起吧,不过这个排序还是蛮有意思的,严格来说复杂度是O(N2),不过在多核的情况下,可以做到 N2 /(m/2)的效率,这里的m就是待排序的个数,当m=100,复杂度为N2 /50,还行把,比冒泡要好点,因为重点是解决问题的奇思妙想. 下面我们看看这个算法是怎么描述的,既然是奇偶,肯定跟位数有

经典算法题每日演练——第二十一题 十字链表

原文:经典算法题每日演练--第二十一题 十字链表 上一篇我们看了矩阵的顺序存储,这篇我们再看看一种链式存储方法“十字链表”,当然目的都是一样,压缩空间. 一:概念 既然要用链表节点来模拟矩阵中的非零元素,肯定需要如下5个元素(row,col,val,down,right),其中: row:矩阵中的行. col:矩阵中的列. val:矩阵中的值. right:指向右侧的一个非零元素. down:指向下侧的一个非零元素. 现在我们知道单个节点该如何表示了,那么矩阵中同行的非零元素的表示不就是一个单链

经典算法题每日演练——第二十五题 块状链表

原文:经典算法题每日演练--第二十五题 块状链表 在数据结构的世界里,我们会认识各种各样的数据结构,每一种数据结构都能解决相应领域的问题,每一种数据结构都像 是降龙十八掌中的某一掌,掌掌毙命... 当然每个数据结构,有他的优点,必然就有它的缺点,那么如何创造一种数据结构 来将某两种数据结构进行扬长避短,那就非常完美了.这样的数据结构也有很多,比如:双端队列,还有就是今天讲的 块状链表, 我们都知道 数组 具有 O(1)的查询时间,O(N)的删除,O(N)的插入... 链表 具有 O(N)的查询时