算法与程序设计_算法与程序设计入门-简单计算题1
在这里我们直接把题目抽离成顶点和边来描述,就不贴原题以避免引起不必要的解释。
问题描述:现在有一个简单无向图,且每个顶点最多与其他顶点之间连接m条边,现在有n个顶点,问最多能在各顶点之间连接多少条边?
标准输入n、m(1≤n≤10000,0≤m≤10000)
题解思路:
简单思考之后先把简单特殊情况梳理出来在程序中用if语句分开赋输出值output(单一出口原则):
1.m==0||m==1&&n>2||m==1的情况:output=0;
2.m≥n-1的情况:output=
3.简单情况列好之后,现在有:n-1>k≥2我们可以开始往最大的情况猜测,即:每条边都可以连接m条边,你说巧不巧居然真的成立(近似成立,在奇数时稍有调整)。下面给出不严谨的证明(一个说明:更严谨的证明应当对m、n的奇偶性利用螺旋归纳法证明结论f(n,m)=[m✖️n]/2,对两种情况分别推出f(n+1,m)和f(n,m+1),由于其中拆边补边的操作也较为简单,就把过程留给聪明的读者吧,相信你稍加思考便能想清楚是怎么回事):
情况一:m、n至少有一个偶数.
假设任意两条顶点之间都连接一条边,现在连接了
条边,我们现在对这个图 的边进行一系列消除,操作方法(操作方法便是直接构造的不严谨之处,利用螺旋归纳法可以避免直接完整构造):设所有顶点为e1,...,en,从第一个顶点e1到最后一个顶点en,每个点的度数逐个调整到m),由于所有的顶点之间都连接了边,从剩下的度大于m下标大于i的顶点中找到顶点可以与正在被操作的顶点ei之间的连线消除,使得在有限次操作之后可以恰好得到这个图的度数为m×n(为偶数,消去了
),可以使得每个点的度数恰好为m;于是output=
情况二:m、n均为奇数时
同样进行任意两个顶点之间连接一条边的操作,然后对边进行消除,我们下面证明度数最高为m×n-1。
首先说明m×n-1一定成立:我们对顶点-度数(n,m-1)来说,它们之间可以按情况一的方式操作使得这n个顶点每个顶点的度数都为m,然后我们将n个点之间连线,最多可以连接
条线,使得这些顶点的度数为m,剩下一个度数为m-1,故这种情况成立。
然后证明度数大于等于m×n+1不成立(度数为偶数):由抽屉原理必然存在一个顶点,它的度数大于等于m+1,与题意矛盾。故有output=
综上,output=
,证毕
output=
附上简单的代码:
int output;if(m>=n-1){output=n*(n-1)/2;}else if(m==0||(n!=2&&m==1||n==1)){output=0;}else{output=n*m/2;}
P.S.好多大佬都已经过了这道题了...他们肯定写了几个很快猜出结论就直接输出了吧,他们都好厉害,我目前还做不到(可能很长一段时间都做不到),不过会尽力去适应的,上个月的这一天,也就是2.6日我开始了关于C语言的学习,两周跟着mooc把c语言的语法学完,然后好奇地上洛谷看了看很艰难地做了十道题之后,说实话挑战是很大的,期间有很多次wa,ce,tle,2月的月赛也出于试一试的心态报了div2,一下午4个小时,连滚带爬,顺便一位大佬(一直到现在给我提供的各种帮助我也感激不尽)捞了我一把,把第一道题在最后两分钟,5:58的时候做出来了,那时的感觉其实是与曾经做数学竞赛时解题的心情是类似的,于是之后退补选课的时候也把偏文的漫话数学建模给退掉,选了acm-icpc程序设计的选修课(不过每节课布置18道题好多啊QAQ),尽管现在做contest练习对我来说相对较难(日均2.5道题左右),但我仍然需要在尽力的尝试中才能进步。回忆两年前的时候,曾经平面几何怎么做都不顺手,在那天暑假大概七月下旬集训之后的十多天里决心把平几100题刷了五十道题,一直到当年联赛的时候,不都得心应手地解决了问题吗?即使我是一个相对愚钝的人,但我选择相信人的可塑性,努力不一定有所回报,但在我还一无是处的时候,我必须做出突出自己的选择,以及为之付出的决心。加油吧!先立个小目标:日均代码200行,以及第二个小目标:校赛不爆零。
这是我的第一篇有意义的文章,题也是刚刚做的,如果内容有不妥的地方欢迎指出,同时有一些具体的数学证明没有深入,都是以大白话的方式叙述的,所以有不严谨之处也请不吝赐教。谢谢你。
算法与程序设计_算法与程序设计入门-简单计算题1相关推荐
- 读书-算法《程序设计导引及在线实践》-简单计算题5:装箱问题
问题: 问题分析:主要考虑3*3的产品问题,结合实现的代码想一下,或则是想一下再结合代码 编一下代码: #include <stdio.h> void main() {int N, a, ...
- moead算法流程步骤_算法——抓住程序的灵魂
做任何事情都要有一定的步骤,为了解决一个问题而采取的方法和步骤就称为算法.C语言的算法是计算机算法,即计算机能够执行的算法.只有明确了算法后,才能使应用程序实现某些功能.所以,通常人们会将算法称为程序 ...
- python算法工程师书籍_算法工程师路线图(经验浓缩,纯干货!)
说起算法(Algorithm),需要值得注意的是,数据结构与算法,机器学习算法都可简称为算法,但两者是完全不同的.数据结构与算法是计算机科学中的一门基础课程,主要内容是关于如何设计计算机程序,使得程序 ...
- 排序算法的时间复杂度_算法的时间复杂度
一. 算法的时间复杂度 1.如何评估算法的性能 数据结构和算法,本质上是解决现实存在的问题,即如何让解决指定问题的代码运行得更快?一个算法如果能在所要求的资源限制(resource constrain ...
- a*算法的时间复杂度_算法基础——时间复杂度amp;空间复杂度
关注.星标公众号,学点计算机知识. 整理:persistenceBin 今天来跟大家继续分享一下数据结构的基础知识--算法效率的度量:时间复杂度和空间复杂度.首先来跟大家分享一下在电影<复仇者联 ...
- a*算法迷宫 c++_算法竞赛专题解析(12):搜索基础
搜索 搜索,就是查找解空间,它是"暴力法"算法思想的具体实现. 文章目录: 01 搜索简介 02 搜索算法的基本思路 03 BFS的性质和代码实现 04 DFS的常见操作和代码实现 ...
- a*算法的时间复杂度_算法的时间和空间复杂度,就是这么简单
算法(Algorithm) 算法是程序用来操作数据.解决程序问题的一组方法.对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别. 那么我们应该如何去 ...
- 简述isodata算法的原理_算法常见面试题汇总(一):概率论与数理统计部分
初级或中级算法岗面试题主要有四类:数理统计基础.机器学习模型原理.编程能力.项目经验.项目经验因人而异,所以仅总结前三个方面的基础知识,分享给朋友.(高级或资深算法岗面试内容不在本文范围内) 1.大数 ...
- c++矩阵连乘的动态规划算法并输出_算法面试必修课,动态规划基础题型归纳(三)
动态规划(Dynamic Programming,简称DP),是大家都觉得比较难以掌握的算法.为了应付面试,我们经常会背诵一下DP问题的源码,其实,只要理解了思想,掌握基本的模型,然后再来点写代码的套 ...
最新文章
- Windows程序设计学习笔记(1):一个简单的windows程序
- RESTful之自动生成接口文档
- FPGA和DSP间基于SRIO的高速通信系统设计
- 快速的找出元素是否在list中 python
- BlogEngine.Net架构与源代码分析系列part12:页面共同的基类——BlogBasePage
- SparkStreaming项目(实时统计每个品类被点击的次数)
- 某些安卓手机在Mac系统下无法通过数据线连接ADB(安卓手机USB双模式)解决方案...
- 不靠运气靠实力 BEA全球大会千元门票免费送
- 在 SSD 上使用 btrfs 文件系统的相关优化
- 分享一些很小众但是很实用的软件
- 使用ffmpeg简单合并视频(2个以上)
- DES加密解密算法(简单、易懂、超级详细)
- windows移动硬盘接到mac上使用(加载ntfs移动硬盘)
- Mac没声音解决办法记录
- Win32 IME 编程心得【转】
- 计算机视觉基础知识复习
- 【感恩】为做运维的重病老同事李静波寻求帮助
- 2020,我不想奋斗了
- 无法打开位置服务器,电脑的定位功能无法打开怎么办?
- 虚拟服务器不能打字,光遇修理服务器,玩家无法打字聊天,如何用“光语”说我爱你?...
热门文章
- 【SpringCloud】Spring cloud Alibaba Sentinel 规则持久化
- 【Kafka】kafka 创建 topic的时候 Replication factor 参数理解
- Spark调优 shuffle调优
- 【Flink】Flink 操作HDFS报错 hadoop is not in the classpath/dependencies
- 95-180-040-源码-Watermark-简介
- 14-Scala之隐式转换
- spark学习-JavaRDD注册成表然后用SparkSQL查询
- 超给力,抛弃手动维护,一键生成数据库文档、支持多种格式!
- 记一道简单的Java面试题,但答错率很高!
- WSS3.0安装后,系统资源消耗这么大