PAT 1090 危险品装箱

本文探讨了一道类似LeetCode社交网络问题的解题思路,通过使用并查集和Map数据结构来处理社交关系,代码实现详细且实用,适合对数据结构和算法有兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个和甲级的一道题重复了。

今天真的不适合写代码吧,一个下午就ac了3道题,头很大。

这道题有点像leetcode朋友圈,应该可以用并查集做,我用了map的方法,具体看代码吧。

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <string>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <cctype>
#include <set>
#include <deque>
#include <cmath>



using namespace std;





unordered_map<int, set<int>> hash_table;


int main(){
//        printf("123\n");
    int n,m;
    scanf("%d%d",&n,&m);
    for (int i=0; i<n; i++) {
        int a,b;
        scanf("%d%d",&a,&b);
        hash_table[a].insert(b);
        hash_table[b].insert(a);
    }
    for (int i=0; i<m; i++) {
        int a;
        scanf("%d",&a);
        vector<int> pack;
        bool isIn[1000000] = { false };
        for (int j=0; j<a; j++) {
            int b;
            scanf("%d",&b);
            pack.push_back(b);
            isIn[b] = true;
        }
        
        bool flag = true;
        for (int j=0; j<a; j++) {
            for (auto it =hash_table[pack[j]].begin(); it!=hash_table[pack[j]].end(); it++) {
                if(isIn[*it]){
                    flag = false;
                    printf("No\n");
                    break;
                }
            }
            if(!flag)
                break;
        }
        if(flag)
            printf("Yes\n");
    }
}

 

<think>好的,我现在需要处理用户关于PAT 1090题目的查询。首先,用户提到的是PAT甲级题目,但提供的引用是1150题,可能与用户的需求不符。我需要先确认PAT 1090的具体内容。 PAT的题目编号通常与考试年份和题目顺序相关,但用户可能记错了编号。例如,1090可能属于甲级或乙级。我需要回想一下常见的PAT题目。常见的甲级题目如1001、1011等,1090可能不是甲级的,可能属于乙级或者用户记错了编号。 接下来,考虑用户提供的引用[1]和[2]都是关于1150题,即旅行商问题的变种。但用户现在需要的是1090的相关信息,这可能存在编号错误。例如,PAT 1090可能对应“Highest Price in Supply Chain”这道题,这道题确实存在,属于甲级题库,考察树的遍历或DFS/BFS的应用。 用户可能想查询供应链中的最高价格问题。这道题的描述通常涉及树结构,计算从根节点到叶子节点的最长路径,并统计这样的路径数目。例如,每个节点代表一个供应商,父节点到子节点的传输会提高价格,求最高价格以及对应的路径数。 因此,我需要确认PAT 1090的题目内容,并给出解答思路。首先,题目输入通常是节点数、根节点编号,然后是每个节点的父节点。然后,根节点的价格给出,每个非根节点的价格是父节点的价格乘以(1 + r%),其中r是给定的比率。需要找到最高的价格以及拥有这个价格的叶子节点数量。 解答方法通常包括构建树结构,使用DFS或BFS遍历所有叶子节点,记录路径的价格,并比较最大值。同时统计最大价格出现的次数。例如,可以用递归DFS,从根节点开始,逐层计算每个子节点的价格,当遇到叶子节点时更新最大值和计数。 代码部分需要注意浮点数精度问题,可能需要用double类型存储价格。此外,需要高效遍历,避免超时。通常,使用邻接表表示树结构,然后进行深度优先搜索即可。 用户可能需要的相关问题是关于树遍历的应用、供应链问题的变种,或者如何优化此类问题的解决方法。例如,如何避免重复计算,如何处理大规模数据等。 最后,生成相关问题时要围绕PAT 1090的考点,比如树遍历、DFS/BFS的应用、动态规划是否适用,或者类似题目的比较,如与供应链相关的其他题目。</think>关于PAT 1090题目的解答与描述: 根据题目编号推断,PAT 1090对应的是**供应链最高价格问题(Highest Price in Supply Chain)**,属于树遍历的典型应用。题目要求从供应链的根节点出发,找到所有叶子节点中价格最高的路径,并统计达到该价格的叶子节点数量[^1]。 ### 问题描述 供应链中,每个节点(供应商)将产品以**固定利润率**传递给下级节点,最终价格计算公式为: $$P = P_{\text{root}} \times (1 + r\%)^d$$ 其中$d$是节点到根节点的深度。要求输出最高价格及其对应的叶子节点数量。 ### 解题思路 1. **树结构构建**:用邻接表存储非叶子节点的子节点列表,根节点通过输入的特殊标识(通常为-1)确定; 2. **深度优先搜索(DFS)**:从根节点出发递归计算每个叶子节点的价格,动态更新最大值和计数器; 3. **浮点数精度处理**:用`double`类型存储价格,避免计算误差。 ### 示例代码 ```python import sys sys.setrecursionlimit(10000) n, root_price, r = map(float, input().split()) n = int(n) tree = [[] for _ in range(n)] root = -1 for i in range(n): parent = int(input()) if parent == -1: root = i else: tree[parent].append(i) max_price = -1.0 count = 0 def dfs(node, current_price): global max_price, count if not tree[node]: # 叶子节点 if current_price > max_price: max_price = current_price count = 1 elif current_price == max_price: count += 1 return for child in tree[node]: dfs(child, current_price * (1 + r / 100)) dfs(root, root_price) print(f"{max_price:.2f} {count}") ``` ### 复杂度分析 - 时间复杂度:$O(n)$,每个节点仅访问一次 - 空间复杂度:$O(n)$,存储树结构的邻接表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值