《挑战程序设计竞赛》开篇抽签问题

挑战程序设计:抽签 抽签 你的朋友建议玩一个游戏:将写有数字的 n 个纸片放入口袋中,你可以从口袋中抽取4次纸片,每次记下纸片上的数字后都将其放回口袋中。如果这4个数字的和是 m ,就是你赢,否则就是你朋友赢。你挑战了好几回,结果一次也没赢过,于是怒而撕破口袋, 阅读详情

将写有数字的n个纸片放入一个纸箱子中,然后你和你的朋友从纸箱子中抽取4张纸片,每次记下纸片上的数字后放回子箱子中,如果这4个数字的和是m,代表你赢,否则就是你的朋友赢。

请编写一个程序,当纸片上所写的数字是k1,k2,k3,k4,..,kn时,是否存在抽取4次和为m的方案,如果存在,输出YES;否则,输出NO。

限制条件:

  • 1 <= n <= 50
  • 1 <= m <= 10^8

  • 1 <= ki <= 10^8
  • #define N 5
    #define M 10
    
    set<int> s;
    
    int myCmp(const void *a, const void *b) {
    	return *(int*) a - *(int*) b;
    }
    
    void initRandom(int* arr) {
    	srand(unsigned(time(0)));
    	for (int i = 0; i < N; i++) {
    		arr[i] = rand() % 10;
    	}
    	qsort(arr, N, sizeof(int), myCmp);
    }
    
    void initSumSet(int* arr) {
    	for (int i = 0; i < N; ++i) {
    		for (int j = 0; j < N; ++j) {
    			s.insert(arr[i] + arr[j]);
    		}
    	}
    }
    
    int binaryFind(int* arr, int find) {
    	if (!arr) {
    		return -1;
    	}
    	int low = 0;
    	int high = N - 1;
    	int mid = (low + high) / 2;
    
    	while (low <= high) {
    		if (find < arr[mid]) {
    			high = mid - 1;
    		} else if (find > arr[mid]) {
    			low = mid + 1;
    		} else if (find == arr[mid]) {
    			return mid;
    		}
    		mid = (low + high) / 2;
    	}
    	return -1;
    }
    
    void findFourNum2Sum(int* arr) {
    	for (int i = 0; i < N; i++) {
    		if (i > 0 && arr[i - 1] == arr[i]) {
    			continue;
    		}
    		for (int j = 0; j < N; j++) {
    			if (j > 0 && arr[j - 1] == arr[j]) {
    				continue;
    			}
    			for (int k = 0; k < N; k++) {
    				if (k > 0 && arr[k - 1] == arr[k]) {
    					continue;
    				}
    				int id = -1;
    				if ((id = binaryFind(arr,
    				M - (arr[i] + arr[j] + arr[k]))) != -1) {
    					cout << arr[i] << "+" << arr[j] << "+" << arr[k] << "+"
    							<< arr[id] << endl;
    				}
    			}
    		}
    	}
    }
    
    int find2NumEqToSum(int* arr, int sum, int index1, int index2) {
    	int flag = 0;
    	int begin = 0;
    	int end = N - 1;
    	while (begin < end) {
    		if (arr[begin] + arr[end] < sum) {
    			begin++;
    		} else if (arr[begin] + arr[end] > sum) {
    			end--;
    		} else {
    			flag = 1;
    
    			cout << arr[index1] << "+" << arr[index2] << "+" << arr[begin]
    					<< "+" << arr[end] << endl;
    			begin++;
    			end--;
    			while (arr[begin] == arr[begin - 1]) {
    				begin++;
    			}
    			while (arr[end] == arr[end - 1]) {
    				end--;
    			}
    		}
    	}
    	return flag;
    }
    
    void findFourNum2Sum1(int* arr) {
    	for (int i = 0; i < N; i++) {
    		if (i > 0 && arr[i - 1] == arr[i]) {
    			continue;
    		}
    		for (int j = 0; j < N; j++) {
    			if (j > 0 && arr[j - 1] == arr[j]) {
    				continue;
    			}
    			set<int>::iterator it = s.find(M - arr[i] - arr[j]);
    			if (it != s.end()) {
    				find2NumEqToSum(arr, M - arr[i] - arr[j], i, j);
    			}
    		}
    	}
    }
    


ACM挑战程序设计竞赛1.1抽签 试题描述 你的朋友提议玩一个游戏:将写有数字的n 个纸片放入口袋中,你可以从口袋中抽取4 次纸片,每次记下纸片上的数字后都将其放回口袋中。如果这4 个数字的和是m,就是你赢,否则就是你的朋友赢。你挑战了好几回,结果一次也没赢过,于是怒而撕破口袋,取出所有纸片,检查自己是否真的有赢的可能性。请你编写一个程序,判断当纸片上所写的数字是k1,k2, …, kn 时,是否存在抽取4 阅读详情

相关推荐

比赛抽签-各种比赛抽签用

各种比赛抽签用,可以简化平常的工作,能提高效率,结省时间

抽签问题的解法分析

题目描述 你的朋友提议玩一个游戏:将写有数字的n个纸片放入口袋中,你可以从口袋中抽取4次纸片,每次记下纸片上的数字后都将其放回口袋中。如果这4个数字的和是m,就是你赢,否则就是你的朋友赢。你挑战了好几回,结果一次也没赢过,于是怒而撕破口袋,取出所有纸片,检查自己是否真的有赢的可能性。请你编写一个程序,判断当纸片上所写的数字是 ki,k和,…,kn时,是否存在抽取4次和为m的方案。如果存在,输出Yes;否则,输出No。 限制条件 1≤n≤50 m≤108 1k≤108 示例1 输入: 3 9 1 3

Demon_LMMan的博客 1649

Gitee自动创建PR之——评审模式

一 创建PR的常规操作 本地更新主干(一般为master分支),基于主干新建一个分支并(如Dev分支)切换; 进行新的需求开发; 将这个分支推送到远端; 打开 Gitee ,进入创建 Pull Request 界面; 选定目标分支(及我们需要合并到主干分支的分支,一般即为我们的开发分支); 填写 Title 以及 Description; 点击提交 Pull Request。 二 更快的常见PR的方式— — 评审模式 现在 Gitee.

calm_encode的博客 2990

挑战程序设计竞赛讲解 ——抽签问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、问题是什么? 二、思路与实现 1.暴力搜索,四重循环实现 2.次升级版 3.升级版 总结 前言 算法设计的时候,当输入数据过大,会导致程序崩溃,所以复杂度尤为重要,留下痕迹再走哦! 一、问题是什么? 二、思路与实现 1.暴力搜索 ,四重循环解决 代码如下: import java.util.Scanner; public class ...

s963738128的博客 528

VisionMaster Qt二次开发:图像获取、COM组件渲染与本地化存储实战

本文详细介绍了基于VisionMaster进行Qt二次开发的核心实战流程,涵盖环境搭建、方案加载、图像数据获取、COM组件渲染与本地化存储。重点解析了如何通过COM组件在Qt界面中实时显示图像,以及将VM图像数据转换为QImage并保存为本地文件的关键步骤与常见问题,为工业视觉项目开发提供稳定高效的解决方案。

weixin_29229261的博客 206

pycharm添加Anaconda解释器显示不出来

因为我之前下载的是pycharm最新版本2024.1的,所以我抱着试一试的心态卸载重装了2021.3.3的,创建新文件的时候立刻就自己识别好了conda环境。就是图中画圈的地方,之前一直显示为python的图标,但是再Python Interpreter后面跟的路径确实是我下载anaconda的地方。另外一种方法就是使用Virtualenv Environment方式配置,但是我的pycharm还是没有识别出conda的图标。首先是这位的方法,先添加系统解释器,再重启,但是我的图标还是python。

2202_75803271的博客 4006

挑战程序设计竞赛:难度增加的抽签问题

文章目录题目大意解题思路代码知识点 题目大意 解题思路 注意这里有放回抽样。 普通思路,暴力搜素所有4张卡片组合。 复杂度:O(n4)O(n^4)O(n4),超时。 转换思路: a+b+c+d=m⇒a+b=m−c−da+b+c+d = m \Rightarrow a+b=m-c-da+b+c+d=m⇒a+b=m−c−d 因此我们先计算出任意两个物品的重量和。这样共有n2n^2n2个组...

Wangpeiyi9979的博客 365

Kettle安装与使用

Pentaho Data Integration作为一个端对端的数据集成平台,可以对多种数据源进行抽取(Extraction)、加载(Loading)、数据落湖(Data Lake Injection)、对数据进行各种清洗(Cleasing)、转换(Transformation)、混合(Blending),并支持多维联机分析处理(OLAP)和数据挖掘(Data mining)。勺子(spoon.bat/spoon.sh):是一个图形化的界面,可以让我们用图形化的方式开发转换和作业。

jnrjian的博客 1万+

《挑战程序设计竞赛》 P2 题目:抽签 优化,优化,再优化

样例:输入:3101 3  5输出:Yes输入:391 3 5输出:No#include &lt;bits/stdc++.h&gt; using namespace std; const int MAX_N=51; int k[MAX_N]; int kk[MAX_N * MAX_N]; int main() { int n, m; //n个数。取四次, 要求和为m; ...

登山望远海 立马定中原 361

【ACP】2025-最新-疑难题解析-1

即用户手动释放时,因实例释放保护开启,不会释放该 ECS 实例(不同云厂商具体实现有差异,但题目场景下选 C )。结合题目中标记,答案为。综上,答案选 B。综上,答案选 C。综上,答案选 D。综上,答案选 A。综上,答案选 A。综上,答案选 C。综上,答案选 D。综上,答案选 A。

jundao1997的专栏 364

23 中望CAD二次开发(ZRX C++)-自定义实体(二)

本文详细介绍了自定义图形实体,如何实现几何变换、捕捉、节点编辑,并介绍了CAD代理的概念。

cilvsuanna的博客 437

挑战程序设计竞赛(第一章)

文章目录三角形Ants难度增加的抽签的抽签问题 三角形 参考博文:挑战程序设计竞赛: 三角形 思路:先排序,使得可以确定比较时的最大边,然后遍历,每一次取三个边,判断是否满足三角形条件。 代码: #include <iostream> #include <algorithm> using namespace std; const int MAX = 101; bool ...

Accept1234的博客 721

【AMD | Docker】超级全面版本:在Docker中验证AMD GPU移动显卡可用性的方法

1. 安装ROCm Docker支持 ■AMD GPU驱动 ■ROCM ■Docker 2. 配置Docker使用ROCm 3. 使用官方ROCm Docker镜像 4. 使用Docker CLI参数访问GPU

静谧、淡雅 684

【读书笔记】《挑战程序设计竞赛》

《挑战程序设计竞赛》 文章目录《挑战程序设计竞赛》前言一、蓄势待发--准备篇1.5.1 算法复杂度1.6.1 O(nlogn)三角形问题1.6.3 抽签问题(四数之和)练习一、初出茅庐--初级篇2.1 “穷竭搜索”--暴力数据结构:遍历方法:DFS--水洼的数量练习BFS--迷宫最短路径next_permutation(begin(nums), end(nums))练习剪枝2.2 一直向前!--贪心 前言 坚持就是胜利,本人使用语言java 一、蓄势待发–准备篇 1.5.1 算法复杂度 详细总结来源

qq_39457586的博客 1502

如何解决Dify重新部署(升级到最新版)后出现的Setup failed: PermissionDenied等问题

重新部署(升级)Dify后遇到Permission denied错误?🚫 本文详细分析了这个问题的原因🔐,并提供了完整的解决步骤来修复这个问题✨

XiaoqiangClub的博客 1653

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ACM:《挑战程序设计竞赛》

前言: 这篇博客是对《挑战程序设计竞赛》的分章节总结。 文章目录第一章:蓄势待发——准备篇第二章:初出茅庐——初级篇 第一章:蓄势待发——准备篇 题目名称 题目标签 题目难度 解题报告 三角形 爆搜 ✦✧✧✧✧ 戳这里 Ants 脑洞 ✦✦✧✧✧ 戳这里 难度增加的抽签问题 二分 ✦✦✧✧✧ 戳这里 第二章:初出茅庐——初级篇 题目名称 题目标签 题目难度 解...

Wangpeiyi9979的博客 2212

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

挑战程序设计竞赛 — 知识总结

准备篇1.5 运行时间概述编写的目的是面向ACM程序设计竞赛,不可避免的要涉及复杂度和运行时间的问题,本节给出了解决问题算法选择的依据。假设题目描述中给出的限制条件为n&lt;=1000,针对O(n2)的算法将会执行大于106次。如果时间限制是1s,则有下述结论:上述结论表明,针对O(n2)的算法,n&lt;=1000可以在时限内解决,但是如果n&lt;=10000,则超时的可能性非常大,这就启示...

Tham 在思索中前行! 4140

efm32 入门.pdf

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

挑战程序设计竞赛(第2版)》

《挑战程序设计竞赛(第2版)》 基本信息 作者: (日)秋叶拓哉 岩田阳一 北川宜稔 译者: 巫泽俊 庄俊元 李津羽 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115320100 上架时间:2013-6-14 出版日期:2013 年6月 开本:16开 页码:1 版次:2-1 所属分类:计算机 &gt; 软件与程序设计 &gt; 综合 &gt; 综...

weixin_34183910的博客 1268

挑战程序竞赛——抽签进阶

原始枚举公式是ka + kb + kc + kd = =m,现在把公式变形,变成kc + kd = m - ka - kb,两重循环枚举kc + kd,再用两重循环。首先,进阶版抽签,与普通法版的区别是:n的数量级变大,导致我们不能暴力枚举。其次,如果你们对二分搜索不明白的话,我后续会出专题,感兴趣的可以关注我。......

Ten_years_star的博客 196

《挑战程序设计竞赛》 读后感

最近要开始准备面试找工作,算法是准备的重中之重,舍友推荐了《挑战程序设计竞赛》这本书。花了一周的时间大体过了一遍,该书真切地让我理解了“智商是硬伤”这句话的含义。我对它的评价是:如果智商小于120,只看前两章就够了;智商大于120小于150,三四章的简单章节还是可以看一下的;智商大于150,看完本书问题不大。望大家量力而为,否则你的自信心会遭受严重的打击。 下面把自己看懂的,并感觉比较重要的内容

姚光超的专栏 2万+

索引(挑战程序设计竞赛——经验篇)

本博文是对博主的**挑战程序设计竞赛——经验篇**分类的索引。

Accept1234的博客 519

语言程序设计赵山林电子版_编程学习《挑战程序设计竞赛》,有资源

《挑战程序设计竞赛(第2版)》对程序设计竞赛中的基础算法和经典问题进行了汇总,分为准备篇、初级篇、中级篇与高级篇4章。作者结合自己丰富的参赛经验,对严格筛选的110 多道各类试题进行了由浅入深、由易及难的细致讲解,并介绍了许多实用技巧。每章后附有习题,供读者练习,巩固所学。 《挑战程序设计竞赛(第2版)》适合程序设计人员、程序设计竞赛爱好者以及高校计算机专业师生阅读。 本书的作者们参加过众多程序设...

weixin_30336949的博客 199

挑战程序设计竞赛(第2版)pdf

下载地址:网盘下载内容简介······世界顶级程序设计高手的经验总结【ACM-ICPC全球总冠军】巫泽俊主译日本ACM-ICPC参赛者人手一册本书对程序设计竞赛中的基础算法和经典问题进行了汇总,分为准备篇、初级篇、中级篇与高级篇4章。作者结合自己丰富的参赛经验,对严格筛选的110 多道各类试题进行了由浅入深、由易及难的细致讲解,并介绍了许多实用...

weixin_30394633的博客 1236

再读《挑战程序设计竞赛》——初出茅庐(1)

入门 Ants 这道题是后面说到的弹性碰撞问题,可以视为互相穿过运动。 Physics Experiment(158页) 高中的物理公式也很重要 对于复杂的问题我们可以考虑有两个球的情况,和蚂蚁问题类似的,两球相撞以后他们就各自弹开,相当于继续按照原来的轨迹运动。 抽签问题(二分+折半查找)O(n2logn) 本题主要在于一个折半查找的预处理 kc_{c}c​+kd_{d}d​=m-ka_{a}a...

jcjbusbjk的博客 247
上一篇: 寻找和为定值的多个数
下一篇: 给定整数a1、a2、a3、...、an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8)。
Edwards_June
博客等级 码龄12年 12粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值