CFGym - 100712C.Street Lamps 贪心+模拟

本文介绍了一道关于在街道上安装路灯的算法题目,通过贪心算法确保每个街区都被照亮,给出了AC代码实现。

1.题目描述:

C. Street Lamps

Bahosain is walking in a street of N​blocks. Each block is either empty or has one lamp. If there is a lamp in ablock, it will light it’s block and the direct adjacent blocks. For example, if there is a lamp at block 3, it will lightthe blocks 2, 3, and 4.Given the state of the street, determine the minimum number of lamps to be installed such that each block islit.

Input

The first line of input contains an integer T (1 ≤ T ≤ 1025)​that represents the number of test cases.

The first line of each test case contains one integer N (1 ≤ N ≤ 100)​that represents the number of blocks inthe street.

The next line contains N​characters, each is either a dot ’.’ or an asterisk ’*’.A dot represents an empty block, while an asterisk represents a block with a lamp installed in it.

Output

For each test case, print a single line with the minimum number of lamps that have to be installed so that allblocks are lit.

Sample Input 

3

6

......

3

*.*

8

.*.....*

Sample Output

2

0

1

2.题目大意:

一条街上若干点(‘*’点)有路灯,路灯照亮的半径是1,问还能在‘.’处至少安装多少盏路灯使得全街被照亮

3.解题思路:

贪心地从左边开始判断,如果没被照亮则放路灯,这样可以保证第i点的前i - 1个位置都是被照亮的

4.AC代码:

#include <stdio.h>
#include <string.h>
#define maxn 101
using namespace std;
int vis[maxn];
char mp[maxn];


int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		memset(vis, 0, sizeof(vis));
		int n, ans = 0;
		scanf("%d", &n);
		scanf("%s", mp);
		for (int i = 0; i < n; i++)
			if (mp[i] == '*')
			{
				vis[i] = 1;
				if (i - 1 >= 0)
					vis[i - 1] = 1;
				if (i + 1 < n)
					vis[i + 1] = 1;
			}
		for (int i = 0; i < n; i++)
		{
			if (!vis[i])
			{
				ans++;
				if (i + 1 < n && mp[i + 1] != '*')
				{
					vis[i] = vis[i + 1] = 1;
					if (i + 2 < n)
						vis[i + 2] = 1;
				}
				else
				{
					vis[i] = 1;
					if (i + 1 < n)
						vis[i + 1] = 1;
				}
			}
		}
		printf("%d\n", ans);
	}
    return 0;
}
<think>嗯,用户想解析和计算颜色混合表达式,涉及Color4和变量a、b、c。首先,我需要明确Color4的结构,通常Color4可能包含RGBA四个分量,每个分量是0到1或0到255的值。用户提到的变量a、b、c可能是颜色参数或者混合系数? 用户的问题比较模糊,可能需要先确定表达式的具体形式。比如,表达式是类似a*ColorA + b*ColorB这样的线性混合吗?或者有更复杂的操作,如叠加、乘法、屏幕模式等混合方式? 接下来,解析表达式需要处理运算符优先级和变量替换。例如,将字符串中的Color4实例和变量a、b、c替换为具体的数值。可能需要用到正则表达式来识别变量和颜色值,然后构建抽象语法树进行计算。 还要考虑颜色值的范围,是否需要归一化处理。比如,如果Color4使用浮点数,可能需要确保计算后的结果在有效范围内,如0到1之间,避免溢出。 另外,用户可能是在编程环境中处理这个问题,比如使用Python或JavaScript,所以可能需要示例代码。例如,用Python的字符串处理和正则表达式来解析表达式,然后使用eval函数进行计算,但要注意安全性问题,避免执行恶意代码。 还要考虑颜色混合的不同算法,比如加法混合、乘法混合、alpha混合等,用户可能需要指定混合模式。如果表达式中有多种混合操作,需要解析每个操作符并应用相应的混合函数。 可能还需要处理括号,确保运算顺序正确。例如,解析表达式中的括号嵌套,使用栈结构来处理运算优先级。 最后,测试不同的用例,确保解析和计算的正确性。例如,输入表达式"0.5*Color4(1,0,0,1) + 0.3*Color4(0,1,0,1)",解析后应正确计算每个分量的加权和,并返回新的Color4值。 总结步骤:定义颜色结构,解析表达式中的变量和颜色值,处理运算符优先级,应用混合算法,处理数值范围,最后验证结果。</think>### 颜色混合表达式解析与计算方法 #### 1. 定义颜色数据结构 Color4通常表示包含RGBA四个通道的颜色值,建议使用元组或类封装: $$Color4(r, g, b, a)$$ 其中$r,g,b \in [0,1]$表示颜色通道,$a \in [0,1]$表示透明度[^1]。 #### 2. 表达式解析步骤 **示例表达式**:`"a*Color4(1,0,0,1) + b*Color4(0,1,0,1) - c"` ① **词法分析**:使用正则表达式识别关键元素 ```python import re pattern = r"([a-zA-Z]+[0-9]*)|([\+\-\*\/\(\)])|([0-9.]+)" tokens = re.findall(pattern, expression) ``` ② **变量绑定**:建立变量值映射表 ```python variables = {'a': 0.5, 'b': 0.3, 'c': 0.1} ``` ③ **语法解析**:构建AST(抽象语法树) ```python def parse_expression(tokens): # 实现运算符优先级处理 # 返回可执行的表达式树 ``` #### 3. 颜色混合计算 **核心算法示例**: ```python def calculate_color(expr, variables): # 替换变量和Color4实例 expr = expr.replace('a', str(variables['a'])) # 将Color4(1,0,0,1)转换为元组 expr = re.sub(r'Color4\(([^)]+)\)', r'(\1)', expr) # 分通道计算 channels = [eval(expr) for _ in range(4)] # 实际需要分通道解析 return Color4(*clamp_channels(channels)) def clamp_channels(values): return [max(0, min(1, v)) for v in values] ``` #### 4. 安全增强方案 - 使用`ast`模块替代直接eval - 白名单限定允许的操作符 - 隔离执行环境(沙箱机制)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值