蓝桥杯【42点问题】c语言版(普通型枚举)

题目描述
众所周知在扑克牌中,有一个老掉牙的游戏叫做 24 点:选取 4 张牌进行加减乘除,看是否能得出 24这个答案。

现在小蓝同学发明了一个新游戏,他从扑克牌中依次抽出 6 张牌(注意不是一次抽出),进行计算,看是否能够组成 42 点 , 满足输出 YES,反之输出 NO。

最先抽出来的牌作为第一个操作数,再抽出牌做第二个操作数,运算结果再当作第一个操作数,继续进行操作。除不尽的情况保留整数。

请你设计一个程序对该问题进行解答。

输入描述
输出仅一行包含 6 个字符。

保证字符 ∈ 3 4 5 6 7 8 9 10 J Q K A 2。

输出描述
若给出到字符能够组成 42 点 , 满足输出 YES,反之输出 NO。

输入:

K A Q 6 2 3

输出:

YES

样例说明
K*A=K即即13*1=13
13/12=1 保留整数
1+6=7
7*2=14
14*3=42

主要问题:

主要处理字符KQJ的问题,以及枚举之后的1024种结果
代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
bool jisuan(int* b, int k)
{
	if (k == 1)
	{
		if (b[0] == 42)
		{
			return true;
		}
		else
			return false;
	}
	int c[10];
			int m = 0;
			for (int p = 0; p < k; p++)
			{
				if (p != 0 && p != 1)
				{
			
### 蓝桥杯 K倍区间 C语言 解题思路 对于蓝桥杯中的K倍区间问题,在解决这类题目时,通常会涉及到数组操作以及特定条件下区间的求和计算。此类问题往往需要遍历给定的数据集并寻找符合条件的子序列或子数组。 考虑到模拟算法的应用特性[^1],可以采用一种较为直观的方法来构建解决方案——即利用双重循环枚举所有可能存在的连续子数组,并针对每一个子数组验证其元素之和是否为某个整数k的倍数。然而这种方法的时间复杂度较高(O()),因此适用于数据规模较小的情况;而在面对更大范围内的输入时,则需考虑更加高效的策略。 为了提高效率,可以通过前缀和加哈希表的方式来进行优化。具体来说: - 预先计算出各个位置上的累积和(也称为前缀和),这样能够快速获取任意两个索引间数值总和; - 使用哈希表记录每种余数首次出现的位置,从而避免重复计算相同模值对应的最短距离; - 当遇到相同的模值时,意味着在这两之间的部分构成了一个完整的周期,也就是所求的目标区间。 以下是基于上述思想编写的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAXN 50005 int prefix_sum[MAXN]; // 存储前缀和 typedef struct { int key; int value; } HashNode; HashNode hashTable[MAXN]; bool visited[MAXN]; void initHashTable() { for (int i = 0; i < MAXN; ++i) { visited[i] = false; } } // 插入键值对到哈希表中 void insertIntoHashTable(int remainder, int index) { if (!visited[(remainder + MAXN) % MAXN]) { // 处理负数取模的结果可能是负数的问题 hashTable[(remainder + MAXN) % MAXN].key = remainder; hashTable[(remainder + MAXN) % MAXN].value = index; visited[(remainder + MAXN) % MAXN] = true; } else { printf("Collision detected!\n"); } } // 查找指定键是否存在 int searchInHashTable(int targetRemainder) { if (visited[(targetRemainder + MAXN) % MAXN]) return hashTable[(targetRemainder + MAXN) % MAXN].value; else return -1; } int main(void){ int n,k; scanf("%d%d",&n,&k); long long sum=0LL; int nums[n],resultCount=0; for(int i=0;i<n;++i){ scanf("%d",nums+i); sum+=nums[i]; prefix_sum[i]=sum%k; if(prefix_sum[i]==0 || searchInHashTable(prefix_sum[i])!=-1) resultCount++; insertIntoHashTable(sum%k,i); } printf("%d\n",resultCount); return 0; } ``` 此段代码实现了通过维护一个哈希表来追踪不同余数第一次出现的位置,进而有效地解决了K倍区间的问题。值得注意的是,这里假设了所有的测试案例都不会引起哈希冲突,实际应用中应当加入相应的处理机制以应对潜在的风险。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值