L3-1 那就别担心了 天梯赛题解

2020团体程序设计天梯赛题解(部分) 这次天梯赛拖后腿了,好几道应该作对的题目都没搞出来 个人题解:这里我只写我个人认为应该写的题解,太简单的就不写了 L2-2 口罩发放 (25分) 思路: 这个题的难点不在于题目,而在于你的读题水平,记住这个题的几个约束条件。1、身份证号必须是18位。2、同一个人在第i天申请成功,则需要等到i + P + 1天才能再次申请。3、每天有S个名额,直到发完为止。4、排序首先按照提交的时间排序,如果时间相同的话,那么按照次序,也就是当天提交时候的顺序。5、答案1记录每天发放的口罩的人的姓名和身份号,答案2记录所有 阅读详情

下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题,其实都不用担心。

ziqia.jpg

博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题(开玩笑的,千万别以为这是真正的逻辑自洽的定义……)。现给定一个更为复杂的逻辑推理图,本题就请你检查从一个给定命题到另一个命题的推理是否是“逻辑自洽”的,以及存在多少种不同的推理路径。例如上图,从“你遇到难题了吗?”到“那就别担心了”就是一种“逻辑自洽”的推理,一共有 3 条不同的推理路径。

输入格式:

输入首先在一行中给出两个正整数 N(1<N≤500)和 M,分别为命题个数和推理个数。这里我们假设命题从 1 到 N 编号。

接下来 M 行,每行给出一对命题之间的推理关系,即两个命题的编号 S1 S2,表示可以从 S1 推出 S2。题目保证任意两命题之间只存在最多一种推理关系,且任一命题不能循环自证(即从该命题出发推出该命题自己)。

最后一行给出待检验的两个命题的编号 A B。

输出格式:

在一行中首先输出从 A 到 B 有多少种不同的推理路径,然后输出 Yes 如果推理是“逻辑自洽”的,或 No 如果不是。

题目保证输出数据不超过 109。

输入样例 1:

7 8
7 6
7 4
6 5
4 1
5 2
5 3
2 1
3 1
7 1

输出样例 1:

3 Yes

输入样例 2:

7 8
7 6
7 4
6 5
4 1
5 2
5 3
6 1
3 1
7 1

输出样例 2:

3 No

问题描述

给定一个逻辑推理图,其中:

  • 节点代表命题(编号1到N)
  • 边代表推理关系(从S1可以推出S2)

要求:

  1. 计算从命题A到命题B的不同推理路径数量
  2. 判断这个推理是否是"逻辑自洽"的(即从A出发的所有路径都能到达B)

初始解决方案

我最初的想法是使用深度优先搜索(DFS)来遍历所有可能的路径:

#include<bits/stdc++.h>
using namespace std;
//#define int double
//stack<char>s2;
//stack<int>s1;
//char g[1005];
//int s[1005];
//map<string,int>m;
//struct node{
//	string name;
//	string hao;
//	int s1;
//	string time;
//}C[50005];
//node D[2000];
//int flag=1;
//bool cmp(node a,node b)
//{
//	return a.time<b.time;
//}
int a,b;

struct node{
	int l,r;
}C[5005];
int n,m;
int ji[5005]; 
int D[5005][5005];
int num=0;
int allflag=0;
void dfs(int x)
{
	if(x==m)
	{
		num++;
		return ;
	}
	if(ji[x]==1)return ;
	ji[x]=1;
	int flagg=1;
	
	for(int i=1;i<=a;i++)
	{
		if(D[x][i]==1)
		{
			flagg=0;
			dfs(i);
		 } 
	}
	if(flagg==1&&x!=m)
		{
			allflag=1;
		}
//		return;
	ji[x]=0; 
}
signed main()
{

	cin>>a;

	cin>>b;
	for(int i=1;i<=b;i++)
	{
		int c,d;
		cin>>c>>d;
		D[c][d]=1;
//		C[n].l++;
//		C[m].r++;
	}
	
	cin>>n>>m;
	dfs(n);
	cout<<num<<" ";
	if(allflag==1)cout<<"No";
	else cout<<"Yes";
	return 0;
 } 

问题分析

经过分析,我发现DFS的时间复杂度在最坏情况下可能达到O(N!),这对于N=500来说显然不可行。需要更高效的算法来解决这个问题。

优化方案

1. 记忆化搜索

通过记录每个节点到终点的路径数量,避免重复计算:

int dfs_memo(int u) {
    if(u == target) return 1;
    if(dp[u] != -1) return dp[u];
    
    dp[u] = 0;
    for(int v : graph[u]) {
        dp[u] += dfs_memo(v);
    }
    return dp[u];
}

2. 拓扑排序+动态规划

更高效的解决方案是使用拓扑排序结合动态规划:

  1. 对图进行拓扑排序
  2. 按照逆拓扑序计算每个节点到终点的路径数
void topological_sort() {
    // 计算入度
    vector<int> in_degree(n+1, 0);
    for(int u = 1; u <= n; ++u) {
        for(int v : graph[u]) {
            in_degree[v]++;
        }
    }
    
    // 拓扑排序
    queue<int> q;
    for(int u = 1; u <= n; ++u) {
        if(in_degree[u] == 0) q.push(u);
    }
    
    vector<int> topo_order;
    while(!q.empty()) {
        int u = q.front();
        q.pop();
        topo_order.push_back(u);
        for(int v : graph[u]) {
            if(--in_degree[v] == 0) {
                q.push(v);
            }
        }
    }
}

3. 逻辑自洽性检查

在计算路径数的同时,检查是否存在无法到达终点的路径:

bool is_consistent = true;
for(int u : topo_order) {
    if(u != target && dp[u] == 0 && has_path_to_start[u]) {
        is_consistent = false;
        break;
    }
}

最终解决方案

结合上述优化,最终的解决方案如下:

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 505;
vector<int> graph[MAXN];
int dp[MAXN];
int visited[MAXN];
int has_path[MAXN];
int n, m;

void dfs(int u, int target) {
    if (u == target) {
        dp[u] = 1;
        has_path[u] = 1;
        return;
    }
    if (visited[u]) return;
    visited[u] = 1;
    dp[u] = 0;
    has_path[u] = 0;
    for (int v : graph[u]) {
        dfs(v, target);
        dp[u] += dp[v];
        if (dp[v] > 0) {
            has_path[u] = 1;
        }
    }
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        graph[u].push_back(v);
    }
    int A, B;
    cin >> A >> B;
    memset(visited, 0, sizeof(visited));
    memset(dp, 0, sizeof(dp));
    memset(has_path, 0, sizeof(has_path));
    dfs(A, B);
    bool is_consistent = true;
    for (int i = 1; i <= n; ++i) {
        if (visited[i] && !has_path[i] && i != B) {
            is_consistent = false;
            break;
        }
    }
    cout << dp[A] << " " << (is_consistent ? "Yes" : "No") << endl;
    return 0;
}
2020年团体程序设计天梯赛-总决赛-题目 L1-1 嫑废话上代码 (5分) L1-2 猫是液体 (5分) L1-3 洛希极限 (10分) L1-4 调和平均 (10分) L1-5 胎压监测 (15分) L1-6 吃火锅 (15分) L1-7 前世档案 (20分) L1-8 刮刮彩票 (20分) L2-1 简单计算器 (25分) L2-2 口罩发放 (25分) L2-3 完全二叉树的层序遍历 (25分) L2-4 网红点打卡攻略 (25分) L3-1 那就别担心了 (30分) L3-2 传送门 (30分) L3-3 可怜的复杂度 (30分) ... 阅读详情

相关推荐

L3-1 那就别担心了 (30分)

这是今年天梯赛的一道题,当时L2的题一道都没过,这道L3的题自然也没看。赛后看了看,感觉蛮有意思,试着做了做。起初想到的思路是:DFS整个有向图,每次遍历到一个点都对该点所经路径+1,可这个题的N蛮大的,果然最后一个点超时,还有一个点答案错误(超时的测试点在我意料之内,本就写了个死笨的解法)。想了想第5个测试点测试的原因,又画了画一些特殊路径,果然找到了bug,从起点推到终点后不能再继续往起点下面推了,也就是把所有终点能到达的点(边)全部砍掉,也就是到达终点就不能往下走了,要把终点看成是一个汇点。解决这个b

m0_50548918的博客 923

L3-1 那就别担心了 (30分) 2020 天梯赛

L3-1 那就别担心了 (30分) 下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题,其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题(开玩笑的,千万别以为这是真正的逻辑自洽的定义……)。现给定一个更为复杂的逻辑推理图,本题就请你检查从一个给定命题到另一个命题的推理是否是“逻辑自洽”的,以及存在多少种不同的推理路径。例如上图,从“你遇到难题了吗?”到“那就别担心了”就是一种“逻辑自洽”的推理,一共有 3 条不同的推理路径

Chantec的博客 1624

5个4000比特大状态置换算法的设计与分析

下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。

HuangJinLong2的博客 341

L3-1 那就别担心了(记忆化搜索)

#include<bits/stdc++.h> using namespace std; const int N=550; int n,m; int x,y; int e[N*N],ne[N*N],h[N],idx; int deg[N]; int num[N]; void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } bool f=false; //x为起点 y为终点 int dfs(int u){ if(num[u]!=-.

qq_44866969的博客 1198

GPU架构-SIMT

本文深度剖析了GPU的SIMT架构,从硬件实现层面解析其与SIMD的本质差异。SIMT通过将32个线程捆绑为warp执行,在标量编程模型下实现数据并行。文章对比了SIMD和SIMT的执行模型、分支处理机制及存储层次,指出SIMT是对SIMD的虚拟化抽象。重点分析了Volta架构引入的独立线程调度技术,以及访存合并对性能的关键影响。通过定量数据展示了各代GPU架构的寄存器文件规模和线程调度机制,为开发者优化GPU程序提供了硬件层面的理论基础。

技术引领业务创新 972

用户行为数据分析 User Behavior Data from Taobao for Recommendation

一、提出问题 二、理解数据 数据来源 阿里云天池数据集:(https://tianchi.aliyun.com/dataset/dataDetail?dataId=649) 本文选取的数据集为UserBehavior.csv,共有5242880条数据。数据的具体类别如下表所示: 用户行为种类有四种,如下表所示 对于数据维度的说明如下: 在本文选取的2017年11月25日到2017年12月3日的时间范围内,不重复的用户数量为10202,不重复的商品ID数为412369,不重复的商品类目ID数为5859,

cccxxxqq的博客 5205

那就别担心了[天梯赛 -- 深度优先遍历]

3.如果本次dfs结束,本次距离仍未0,表示从x不能推理到终点,即不为逻辑自洽,flag置为false。2.否则,遍历所有命题,找到可以从当前命题推理过去的,加到本次距离上。1.如果当前点在之前已经被搜过了,直接返回其距离即可。2.用dis数组存储从下标为i的点到终点的距离。dfs具体流程,返回值为从x开始,到终点的距离。1.用二维数组g存储命题间的关系。3.用flag标记是否为逻辑自洽。

WJTF2的博客 470

CTransformers: 高效的Python语言模型绑定库

CTransformers是一个为C/C++实现的Transformer模型提供Python绑定的开源库。它基于GGML库构建,旨在为开发者提供一种高效且易用的方式来在Python中使用各种流行的语言模型。支持多种流行的语言模型,如GPT-2、LLaMA、Falcon等提供统一的简单API接口支持GPU加速(CUDA和Metal)与Hugging Face Transformers和LangChain集成支持流式输出和嵌入计算。

helloaiworld的博客 1267

题解2020届天梯赛总决赛L3-1那就别担心了

题解2020届天梯赛总决赛L3-1那就别担心了

SolitudeAlma的博客 1003

手把手教你解决Kernel panic报错:init找不到的5种排查方法(附NFS挂载实战)

本文深入解析了Linux系统启动时出现“Kernel panic - not syncing: No working init found”报错的根本原因,并提供了五种系统性的排查方法。文章结合NFS挂载根文件系统的实战场景,详细阐述了从动态链接库依赖、内核引导参数、NFS权限配置、文件系统完整性到内核配置干扰的完整排查路径,帮助开发者快速定位并解决这一常见的系统启动故障。

weixin_29159995的博客 192

自举电容的工作原理-3句话总结

1、一道面试题 照例,先抛出来一道面试题:“Buck电路的SW引脚通常会放置一颗小电容,这颗电容有什么用?”。这个问题问得比较细,非常考验被面试者的硬件基本功。 2、似懂非懂的答案 有小伙伴可能不太清楚这颗电容的作用,回答不上来。也有小伙伴脱口而出:自举电容,用来做升压的。但后面好像说不出来具体逻辑。 没具体了解过,答不上来,也没啥可惜的。但是了解过一点,但又似懂非懂的这种,给出的答案只是轻轻点水或者千篇一律,那无疑是错过了一个加分项。 3、异步Buck的自举环路组成 既然是针对Buck电路讲自举电容,前面

ltqdxl的博客 3万+

4.9天梯赛补题

L3-1 那就别担心了 (30 分) 下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题,其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题(开玩笑的,千万别以为这是真正的逻辑自洽的定义……)。现给定一个更为复杂的逻辑推理图,本题就请你检查从一个给定命题到另一个命题的推理是否是“逻辑自洽”的,以及存在多少种不同的推理路径。例如上图,从“你遇到难题了吗?”到“那就别担心了”就是一种“逻辑自洽”的推理,一共有 3 条不同的推理路

weixin_50909982的博客 433

VIVADO & VITIS 报错记录

问题详情:使用BD用DMA上传少量数据,根据ILA监测到的AXI总线数据正常,VALID信号和READY信号都正常,但是在PS端的cache缓冲区示数为0,打印为0。可能是因为print和printf混用导致。解决方案:修改缓冲区的对齐参数。

Mulun_Zhu的博客 715

2020年团体程序设计天梯赛-总决赛 L3-1 那就别担心了

那就别担心了

weifeng2356的博客 2323

196、NPU的编译器开发:教程与示例代码编写

NPU编译器开发实战指南 摘要:本文分享了NPU编译器开发中的核心挑战与实战经验,通过具体代码示例展示了关键实现技术: 指令生成:必须考虑硬件特性(如地址对齐)和芯片配置抽象化 图优化:重点处理常见冗余结构(Reshape合并、BN融合),并注意数值稳定性 算子拆分:采用分块计算策略适配有限SRAM,需特别注意边界条件处理 内存分配:基于张量使用频率的贪心算法优化SRAM使用效率 文中包含多个真实踩坑案例: DMA地址未对齐导致硬件错误 BN融合时的除零风险 tile边界处理不当引起的精度下降 这些经验为开

m0_50546716的博客 72

CPD (Coherent Point Drift) 算法实现点云配准 C++版

作为和icp并列的点集配准算法cpd为什么没有icp火,等我把整个方案跑完才明白。 首先下载cpd https://github.com/gadomski/cpd 包含的fgt https://github.com/gadomski/fgt 下载到win10的解压后 运行cmake来进行编译 这个时候会提醒缺少eigen3 fgt python 这几个都安装排除后 在build文件夹下会生成vs2017的源码,右键全部生成后在 .\cpd-master\build\Debug 下会生成一个cpd.li

uranus1992的博客 3510

天梯赛L3部分题解

【代码】天梯赛L3部分题解。

victor_hq的博客 725

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

2020年团体程序设计天梯赛-总决赛【个人部分题解】

第一次打这个,我以为是团体赛,实际上就是10个人单独打,然后分数相加,一个队的也不能交流,这不就是个人赛嘛… 文章目录 L1-1 嫑废话上代码 (5分) L1-2 猫是液体 (5分) L1-3 洛希极限 (10分) L1-4 调和平均 (10分) L1-5 胎压监测 (15分) L1-6 吃火锅 (15分) L1-7 前世档案 (20分) L1-8 刮刮彩票 (20分) L2-1 简单计算器 (25分) L2-2 口罩发放 (25分)

nefu_ljw的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

2020团队天梯赛-正赛-L3题目集

L3题目集L3-01 那就别担心了(30分的0分)一级目录 L3-01 那就别担心了(30分的0分) 题目描述: 下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题,其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题(开玩笑的,千万别以为这是真正的逻辑自洽的定义……)。现给定一个更为复杂的逻辑推理图,本题就请你检查从一个给定命题到另一个命题的推理是否是“逻辑自洽”的,以及存在多少种不同的推理路径。例如上图,从“你遇到难题了吗?

奋斗小白的博客 3004

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

天梯赛临考前查缺补漏

前言 题目全部来源于PTA. 2019 年全国总决赛题集 L2-1 特立独行的幸福

andy dennis的博客 469

L3-1 那就别担心了 (30 分)——坑点,测试点分析

文章目录思路AC代码 思路 题目就是求从 AAA 到 BBB 的路径条数,和判断从 AAA 的路径是否都经过 BBB 。我们采用记忆化搜索来加速即可。 这里主要为了说一下坑点,题目可能出现这样的情况: 从 AAA 到 BBB 完全符合题目的条件,但是很多朋友可能没处理好,大家测测这个例子即可。 5 5 1 2 2 3 3 5 4 5 2 4 1 2 AC代码 #include<bits/stdc++.h> #define rep(i,x,y) for(int i=x; i<=y; ++i

qq_45769627的博客 1044

2020年团体程序设计天梯赛 L3-1 那就别担心了 (30分)

下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题,其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题(开玩笑的,千万别以为这是真正的逻辑自洽的定义……)。现给定一个更为复杂的逻辑推理图,本题就请你检查从一个给定命题到另一个命题的推理是否是“逻辑自洽”的,以及存在多少种不同的推理路径。例如上图,从“你遇到难题了吗?”到“那就别担心了”就是一种“逻辑自洽”的推理,一共有 3 条不同的推理路径。 输入格式: 输入首先在一行中给出

weixin_45788900的博客 3064

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 15

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 437

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 362
上一篇: L1-6 吃火锅 天梯赛题解
下一篇: L2-2 老板的作息表-题解
loopdeloop
博客等级 码龄4年 219粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值