PAT-A1053:Path of Equal Weight(普通树的遍历和非递减路径的输出)

目录

题目解释:

解题思路:

ac代码:

多看多做,才能更加熟悉树方面的知识!Very important!!


1053 Path of Equal Weight (30 分)

题目地址:https://pintia.cn/problem-sets/994805342720868352/problems/994805424153280512

 

题目解释:


对于每个结点,上面是结点的编号,用二位数字表示(two-digit),下面是该结点的权值,先寻找所有的路径,使路径上所有结点的权值之和是给定的s,并按非递减顺序输出这些路径上经过的权值。

如果对于两条路径,A1=B1,.....Ai-1=B i-1,Ai>Bi那么A路径比B路径大.

 

解题思路:


1)用path[i]存路径上第i个结点的编号,最后在一次输出编号对应的weight,即node[path[i]].weight

2)对于某个结点的子孩子,要先对这些子孩子的weight排序,即现遍历weight大的子孩子,最后也先输出weight大的子孩子,即实现了非递减得输出路径

3)dfs遍历树

 

ac代码:


#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define maxn 110
using namespace std;
struct NODE{
    int weight;
    vector<int> child;
}node[maxn];//结点数组
bool cmp(int a,int b)//weight从大到小输出,先排序
{
    return node[a].weight>node[b].weight;
}
int n,m,s;
int path[maxn];//path[i]表示路径上第i个结点的编号
void dfs(int index,int numnode,int sum)//访问结点为index,当前结点个数numnode,和sum
{
    if(sum>s) return ;
    if(sum==s)
    {
        if(node[index].child.size()!=0)//非叶子结点
            return ;
        for(int i=0;i<numnode;i++)
        {
            printf("%d",node[path[i]].weight);
            if(i<numnode-1) printf(" ");
            else printf("\n");
        }
        return ;
    }
    for(int i=0;i<node[index].child.size();i++)
    {
        int child=node[index].child[i];
        path[numnode]=child;
        dfs(child,numnode+1,sum+node[child].weight);
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=0;i<n;i++)
        scanf("%d",&node[i].weight);
    int id,k,child;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&id,&k);
        for(int j=0;j<k;j++)
        {
            scanf("%d",&child);
            node[id].child.push_back(child);//向vector中存入孩子
        }
        sort(node[id].child.begin(),node[id].child.end(),cmp);//对每一个结点的子孩子们的weight排序
    }
    path[0]=0;
    dfs(0,1,node[0].weight);
    return 0;
}

 

多看多做,才能更加熟悉树方面的知识!Very important!!

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Java 中的 LocalDate 和 LocalDateTime 类来实现。首先需要将时间段转换为 LocalDateTime 对象,然后将时分秒部分设置为 0 和 23:59:59,分别得到起始时间和结束时间。接下来可以使用 LocalDate 的循环来获取每一天的起始时间和结束时间。 示例代码如下: ```java import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; public class DateTimeExample { public static void main(String[] args) { String startTimeStr = "2020-11-20 09:09:09"; String endTimeStr = "2021-10-09 10:10:10"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 将时间段转换为 LocalDateTime 对象 LocalDateTime startTime = LocalDateTime.parse(startTimeStr, formatter); LocalDateTime endTime = LocalDateTime.parse(endTimeStr, formatter); // 设置时分秒为 0 和 23:59:59 LocalDateTime startOfDay = startTime.with(LocalTime.MIN); LocalDateTime endOfDay = endTime.with(LocalTime.MAX); // 获取每一天的起始时间和结束时间 LocalDate currentDate = startOfDay.toLocalDate(); List<LocalDateTime[]> dayRanges = new ArrayList<>(); while (currentDate.isBefore(endOfDay.toLocalDate()) || currentDate.isEqual(endOfDay.toLocalDate())) { LocalDateTime[] dayRange = new LocalDateTime[2]; dayRange[0] = LocalDateTime.of(currentDate, LocalTime.MIN); dayRange[1] = LocalDateTime.of(currentDate, LocalTime.MAX); dayRanges.add(dayRange); currentDate = currentDate.plusDays(1); } // 输出每一天的起始时间和结束时间 for (LocalDateTime[] dayRange : dayRanges) { System.out.println(dayRange[0].format(formatter) + " - " + dayRange[1].format(formatter)); } } } ``` 输出结果如下: ``` 2020-11-20 00:00:00 - 2020-11-20 23:59:59 2020-11-21 00:00:00 - 2020-11-21 23:59:59 ... 2021-10-08 00:00:00 - 2021-10-08 23:59:59 2021-10-09 00:00:00 - 2021-10-09 23:59:59 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值