小欧吃苹果-OPPO 2024届校招正式批笔试题-数据开发(C卷)

在处理这个问题前,先看一个经典的贪心算法题目。信息学奥赛一本通(C++版)在线评测系统icon-default.png?t=N7T8http://ybt.ssoier.cn:8088/problem_show.php?pid=1320

注意移动纸牌的贪心策略并不是题目中给出的移动次序:第1堆纸牌9<10,因为是最左侧,它只能从第2堆移动过来一张,这个动作是必须做的(没有别的选择),移动1次。第2堆现在7张,只能从第3堆移动过来3张,移动2次。第3堆14张,只能往第4堆移动4张,移动3次。第四堆恰好10张,不移动。此类问题算法从边界节点处理(当然也可以从第n堆开始逆向处理),因为边界只有唯一的移动选择。

题目分析:回到本题目,树中每个节点都有苹果数量的要求,在贪心算法处理过程中,只需先处理哪些只有唯一处理方案的节点,采用类似拓扑排序的方法即可求解。如题目中样例。

拓扑排序针对是有向无环图度为0的点,无向图如何拓扑排序呢?从上图观察可以发现无向图中边缘点度为1。因此将拓扑排序处理节点判定条件从度为0改为度为1即可。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n,a[100005],v[100005],d[100005],ans=0;
vector<int>e[100055];
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j,x,y;
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>a[i];
    for(i=1;i<n;i++)/**< 无向图存储 */
    {
        cin>>x>>y;
        e[x].push_back(y);
        e[y].push_back(x);
        d[x]++,d[y]++;/**< 统计度 */
    }
    queue<int>q;
    for(i=1;i<=n;i++)
        if(d[i]==1) q.push(i);
    while(q.size())
    {
        x=q.front();
        v[x]=1;/**< 标记为已处理节点 */
        q.pop();
        for(i=0;i<e[x].size();i++)/**< x所有邻接点,树结构实际只有一个点可以起作用 */
        {
            y=e[x][i];
            if(v[y]==0)/**< 只能和没有处理过节点交换苹果 */
            {
                ans+=abs(x-a[x]);/**< x节点将自己的值处理为x,花费代价是abs(x-a[x]) */
                if(x>=a[x])  /**< x上多出的值或者缺少的值只能传递给y */
                    a[y]-=x-a[x];
                else
                    a[y]+=a[x]-x;
                d[y]--;/**< y的度减一 */
                if(d[y]==1)
                    q.push(y);
            }
        }
    }
    cout<<ans;
    return 0;
}

相关推荐

  1. OPPO 2024正式试题-后端(C

    2024-07-16 12:32:06       23 阅读
  2. 23年oppo提前B组笔试真题-的卡牌

    2024-07-16 12:32:06       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 12:32:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 12:32:06       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 12:32:06       58 阅读
  4. Python语言-面向对象

    2024-07-16 12:32:06       69 阅读

热门阅读

  1. Android 底部导航栏实现

    2024-07-16 12:32:06       18 阅读
  2. Spark核心技术架构

    2024-07-16 12:32:06       21 阅读
  3. actual combat 33 —— Vue实战遇到的问题

    2024-07-16 12:32:06       22 阅读
  4. MATLAB切片

    2024-07-16 12:32:06       19 阅读
  5. Codeforces Round 958 (Div. 2)[部分题解ABC]

    2024-07-16 12:32:06       27 阅读
  6. 大根堆的实现和堆排序

    2024-07-16 12:32:06       20 阅读
  7. 极客笔记【收藏】

    2024-07-16 12:32:06       23 阅读
  8. 嵌入式驱动源代码(10):NFC芯片PN532驱动开发

    2024-07-16 12:32:06       21 阅读