P1540 机器翻译 (模拟队列) -模拟关卡

探讨了一款机器翻译软件如何通过优化内存管理减少词典查询次数,特别是在内存有限的情况下,采用队列的FIFO特性模拟内存更新,实现高效翻译。

P1540 机器翻译

 

  • 评测方式云端评测
  • 标签NOIp提高组2010
  • 难度普及-
  • 时空限制1000ms / 128MB

题目背景

小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。

题目描述

这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。

假设内存中有M个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过M-1,软件会将新单词存入一个未使用的内存单元;若内存中已存入M个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。

假设一篇英语文章的长度为N个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。

输入输出格式

输入格式:

 

共2行。每行中两个数之间用一个空格隔开。

第一行为两个正整数M,N,代表内存容量和文章的长度。

第二行为NN个非负整数,按照文章的顺序,每个数(大小不超过1000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。

 

输出格式:

 

一个整数,为软件需要查词典的次数。

 

输入输出样例

输入样例#1: 复制

3 7
1 2 1 5 4 4 1

输出样例#1: 复制

5

说明

每个测试点1s

对于10%的数据有M=1,N≤5。

对于100%的数据有0≤M≤100,0≤N≤1000。

整个查字典过程如下:每行表示一个单词的翻译,冒号前为本次翻译后的内存状况:

空:内存初始状态为空。

1.1:查找单词1并调入内存。

2.12:查找单词2并调入内存。

3.12:在内存中找到单词1。

4.125:查找单词5并调入内存。

5.254:查找单词4并调入内存替代单词1。

6.254:在内存中找到单词4。

7.541:查找单词1并调入内存替代单词2。

共计查了5次词典。

 

 

思路:

1. 由题目中的  若内存中已存入M个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。可知我们需要使用队列的FIFO性质模拟内存中增加删除单词的过程

 

2. 再由说明中的过程可以知道,在内存中找到单词不算操作数

 

 

代码

//若内存中已存入MM个单词,软件会清空最早进入内存的那个单词,
//腾出单元来,存放新单词。
//这里可以得知是模拟队列  先进先出
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
const int maxm=105;
int a[maxn];
bool searchs[maxn]; //对来记录某个单词是否存在内存
queue<int> q;  //模拟内存的入队出队 
int m,n;

int main()
{
	std::ios::sync_with_stdio(false);
	int cot=0; //查字典的次数 
	
	cin>>m>>n;  //输入内存的容量和单词数 
	for(int i=0;i<n;i++)
	{
		cin>>a[i];    //输入单词 
	}
	//注意 在内存中找到则不算步数 
	for(int i=0;i<n;i++)  //查询单词 
	{
		if(!searchs[a[i]] && q.size()<m) //说明内存中没有该单词,且内存没有满 
		{
			q.push(a[i]);  //内存加入该单词 
			searchs[a[i]]=true; //该单词置为存在 
			cot++; 
		}
		if(!searchs[a[i]] && q.size()==m) //内存中没有该单词且内存满的情况 
		{
			searchs[q.front()]=false;  //队首元素置为不存在(要出队了) 
			q.pop(); //将队首元素出队
			searchs[a[i]]=true; //该单词置为存在 
			q.push(a[i]);  //新单词入队 
			cot++;
		}	

	}
	cout<<cot<<endl;
	return 0;	
} 

 

<think>我们正在讨论的是在Unreal Engine 5.3中使用影片渲染队列(Movie Render Queue)来渲染环境光遮蔽(AO)的问题。环境光遮蔽(Ambient Occlusion, AO)是一种增强场景中物体之间接触阴影的技术,可以增加场景的深度感和真实感。 在UE5.3中,影片渲染队列是一个强大的渲染序列工具,它允许我们设置多个渲染通道(passes)并输出高质量的视频或图像序列。要渲染AO,我们通常需要将AO作为一个单独的渲染通道输出,或者在后期处理中合成。 根据引用[1][2][3]中提到的渲染队列的概念,虽然这些引用是关于Unity的,但其中关于渲染队列和渲染顺序的原理在图形学中是相通的。在UE中,我们同样需要关注渲染顺序和通道设置。 在UE5.3的影片渲染队列中渲染AO的步骤如下: 1. **设置环境光遮蔽(AO)**: - 在场景中确保启用了AO。可以在项目设置中检查AO的全局设置,也可以在后期处理体积(Post Process Volume)中启用并调整AO参数(如AO强度、半径等)。 2. **创建影片渲染队列设置**: - 在编辑器中选择“窗口”>“过场动画”>“影片渲染队列”。 - 点击“+设置”创建一个新的渲染设置。 3. **添加AO渲染通道**: - 在影片渲染队列的设置中,我们需要添加一个渲染通道来输出AO。UE5.3提供了多种渲染通道,包括Beauty(最终渲染结果)、漫反射、法线、AO等。 - 点击“添加元素”并选择“抗锯齿”和“输出”等相关设置。然后,我们需要添加一个“缓冲器可视化(Buffer Visualization)”通道来捕获AO。 4. **配置AO输出**: - 在“渲染设置”中,找到“抗锯齿”设置,通常选择“Temporal Anti-Aliasing (TSR)”以获得高质量的抗锯齿。 - 在“输出”设置中,添加一个“缓冲器可视化”输出。在“缓冲器可视化”中,选择“环境光遮蔽(Ambient Occlusion)”。 - 设置输出格式(如PNG序列、EXR序列等),并指定输出路径。 5. **调整AO渲染参数**: - 为了获得最佳的AO效果,我们可能需要调整AO的渲染参数。这可以通过在后期处理体积中设置AO参数来实现,也可以在渲染设置中覆盖这些参数。 6. **渲染序列**: -关卡序列(Level Sequence)添加到影片渲染队列中。 - 点击“渲染(本地)”开始渲染。 注意:在渲染AO通道时,我们通常只需要AO信息,而不需要其他颜色信息。因此,我们可以配置影片渲染队列只输出AO通道。 另外,我们也可以选择将AO作为多通道渲染的一部分,与其他通道(如漫反射、高光、深度等)一起渲染,然后在后期合成软件中组合。 **示例设置步骤**: 1. 在影片渲染队列设置中,添加一个“缓冲器可视化”通道: - 在“设置”中,点击“添加元素”>“缓冲器可视化”。 - 在“缓冲器可视化”元素的设置中,选择“环境光遮蔽(Ambient Occlusion)”。 2. 设置输出: - 在“输出”设置中,添加一个“图像输出”元素,并设置文件格式(如PNG)和输出路径。 3. 如果需要,可以添加多个渲染通道(例如,同时输出最终图像和AO通道),但注意这可能会增加渲染时间。 4. 开始渲染。 通过以上步骤,我们就可以在影片渲染队列中渲染出环境光遮蔽(AO)通道了。 **引用说明**:虽然引用的内容来自Unity的渲染队列,但其中关于渲染队列数值越小越先渲染,以及半透明物体从后向前渲染的原则在UE中也是类似的[^1][^2][^3]。在UE中,材质也有渲染优先级设置(如Translucency Sort Priority),可以控制渲染顺序。 **相关问题**: 1. 如何在影片渲染队列中同时输出多个渲染通道(如AO、深度、法线等)? 2. UE5.3中环境光遮蔽(AO)有哪些类型(如SSAO、GTAO、Lumen AO)?它们之间有什么不同? 3. 如何在后期处理软件(如Nuke)中使用UE渲染的AO通道进行合成?</think>### 在 UE5.3 影片渲染队列中渲染环境光遮蔽(AO)的完整指南 #### 一、核心原理 环境光遮蔽(AO)通过模拟物体接触区域的阴影增强场景深度感。在 UE5.3 中需结合**渲染队列**和**多通道渲染**技术: 1. **渲染队列顺序**:根据引用[1][3],UE 按队列值从小到大渲染,AO 通道需在几何体队列(2000)后、透明队列(3000)前插入 2. **AO 类型选择**: - **SSAO** (屏幕空间 AO):实时性能好 - **RTAO** (光线追踪 AO):电影级精度 - **Lumen AO**:动态场景最佳选择 #### 二、分步操作流程 1. **启用 AO 通道**: ```ini ; DefaultEngine.ini [SystemSettings] r.AmbientOcclusion=1 ; 全局启用 AO r.AOQuality=4 ; 质量等级(1-4) r.SSAO=1 ; 启用 SSAO ``` 2. **影片渲染队列设置**: - 打开 `窗口 > 过场动画 > 影片渲染队列` - 添加新设置并配置: ```yaml Anti-Aliasing: TSR (8 samples) Output Format: EXR 16-bit Render Passes: - Beauty (RGB) - Ambient Occlusion (AO) - World Position (可选) ``` 3. **AO 通道参数优化**: ```ini ; PostProcessVolume 设置 AmbientOcclusion Intensity=1.5 ; AO 强度 AmbientOcclusion Radius=200 ; 影响范围(单位:cm) AmbientOcclusion StaticFraction=0 ; 动态对象处理 ``` 4. **渲染队列优先级调整**(关键步骤): - 在材质编辑器中设置 AO 通道的渲染队列值: ```glsl // 材质蓝图 Set Render Queue = 2500 // 介于Geometry(2000)和Transparent(3000)之间[^3] Enable Depth Test = true ``` 此设置确保 AO 在几何体渲染后、透明物体前计算[^2] #### 三、高级技巧 1. **多通道合成控制**: ```blueprint // 蓝图示例:分离AO通道 MovieRenderQueue → Render Passes: - Primary: Beauty (Queue=2000) - Secondary: AO (Queue=2500) → Output to Render Target ``` 2. **光线追踪 AO 优化**: ```ini r.RayTracing.AmbientOcclusion=1 r.RayTracing.AO.SamplesPerPixel=16 ; 采样数 r.RayTracing.AO.Denoiser=1 ; 启用降噪 ``` 3. **性能与质量平衡**: | 质量等级 | SSAO 采样数 | RTAO 采样数 | 适用场景 | |----------|-------------|-------------|----------| | Low | 8 | 4 | 实时预览 | | Medium | 16 | 8 | 过场动画 | | High | 32 | 16 | 最终渲染 | #### 四、疑难解答 1. **AO 边缘闪烁**: - 增加 `r.AO.MaxQuality` 值 - 启用时序重建:`r.TemporalAASamples=64` 2. **透明物体 AO 缺失**: - 在材质中设置:`Allow AO on Transparent=1` - 调整渲染队列值至 2500-3000 区间[^1] 3. **渲染时间过长**: ```ini r.AO.AsyncCompute=1 ; 启用异步计算 r.AO.Downsample=2 ; 降采样渲染 ``` > **操作验证**:渲染后通过 `Composure → Layer Viewer` 检查 AO 通道的完整性,确保无数据缺失或噪点异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值