一道简单题目的优化过程——抽签问题

题目来源:挑战程序设计竞赛

题目描述

  给定n个数字,选择四次,可以选择已经选择过的数字,问是否可以选出和为m的四个数。

首先,最基本的做法:

  枚举四层,每一层枚举出一个数,求出所有四个数字不同的排列。时间复杂度为O(N^4)。

  

 for (int i1=1;i1<=n;i++) for (int i2=i1;i2<=n;i2++) for (int i3=i2;i3<=n;i3++) for (int i4=i3;i4<=n;i4++)

让我们来一步步优化吧。

基本做法的本质是,枚举前三个数字,然后找出来一个可以凑成正确解的数字,找到了,则有答案,否则,继续枚举前三个数。

也就是说,最后一层枚举,本质是一个查找的过程,我们使用了O(N)的查找方式。

  显然对于查找,有很多可以优化的方法,散列表,二分法,我们这里使用二分法,先把数排序,再用二分查找。时间复杂度变为O(N^3*logN)

再看,四个数字,枚举三个数的组合再找,可不可先求出两两数字之和,然后第一层枚举这些和,第二层从这些和中找出一个符合的解?

  

  先枚举出和,N^2,再查找,logN^2

  时间复杂度为N^2*logN

个人感觉,最后的优化多少本身都是带着些”二分问题“的思想在里面的。

一道简单题目的优化过程——抽签问题

时间: 2024-08-28 21:36:18

一道简单题目的优化过程——抽签问题的相关文章

先来一道简单题目过个好年

题意描述:第一行一个整数n,表示考试的人数,第二行n个整数表示每个人的成绩.成绩为0-100之间的整数.且不超过10000个学生.输出占一行.每人挂科需要400元重修费.计算出所有需要交的重修费. 解题思路:计算共有多少个挂科人数,输出人数乘以400或直接+400:代码实现:#include<stdio.h>int main(){ int n,sum=0,i,a,count=0; scanf("%d",&n); for(i=1;i<=n;i++) {  sca

一道简单的动态规划题目——House Robber

一.题目 House Robber(一道Leetcode上的关于动态规划的简单题目)具体描述如下: There is a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent hous

一道简单的递推题(快速幂+矩阵乘法优化+滚动数组)

问题 F: 一道简单的递推题 时间限制: 1 Sec  内存限制: 128 MB提交: 546  解决: 48[提交][状态][讨论版] 题目描述 存在如下递推式: F(n+1)=A1*F(n)+A2*F(n-1)+...+An*F(1) 求第K项的值对1000000007取模的结果 输入 单组测试数据 第一行输入两个整数 n , k (1<=n<=100,n<k<=10000000000) 第二行输入 n 个整数 F(1)   F(2)   ...   F(n) 第三行输入 n

练习题(4) -- 一道简单而有有趣的题目

PS: 因为最近一会儿用C++ 写程序,一会儿是python, 一会儿又是java,搞得我都有点语法错乱了. 题目如下:一个字符串形如 "yazyypta"  从这个字符串中删除任何字符,得到的字符串都是它的子字符串,比如对于这个字符串 "ya", "ayy", "pta" 都是它的子字符串,所有的子字符串按照字母序比较大小,求最大的大小最大的子字符串 举几个例子 1) abc c 2)    bcbxa xa 3)   ba

一道简单的CTFpython沙箱逃逸题目

看了几天的ssti注入然后了解到有python沙箱逃逸 学过ssti注入的话python沙箱逃逸还是很容易理解的. 看一道CTF题目,源码的话我改了改,一开始不能用,直接在py2上运行就好. 题目要求读取./key的值,我们这里来执行命令. def make_secure(): UNSAFE = ['open', 'file', 'execfile', 'compile', 'reload', '__import__', 'eval', 'input'] for func in UNSAFE:

从一道简单的dp题中学到的...

今天想学点动态规划的知识,于是就看了杭电的课件,数塔问题啊,LCS啊都是比较经典的动规了,然后随便看了看就开始做课后练习题... HDOJ 1421 搬寝室 http://acm.hdu.edu.cn/showproblem.php?pid=1421 题目大意:从n(n <= 2000)个数中选出k对数(即2*k个),使它们的差的平方和最小. 例如:从8,1,10,9,9中选出2对数,要使差的平方和最小,则应该选8和9.9和10,这样最小,结果为2 因为知道是dp的题,先建个dp[][]数组,然

高斯模糊算法的全面优化过程分享(二)。

      相关链接: 高斯模糊算法的全面优化过程分享(一) 在高斯模糊算法的全面优化过程分享(一)一文中我们已经给出了一种相当高性能的高斯模糊过程,但是优化没有终点,经过上一个星期的发愤图强和测试,对该算法的效率提升又有了一个新的高度,这里把优化过程中的一些心得和收获用文字的形式记录下来. 第一个尝试   直接使用内联汇编替代intrinsics代码(无效) 我在某篇博客里看到说intrinsics语法虽然简化了SSE编程的难度,但是他无法直接控制XMM0-XMM7寄存器,很多指令中间都会用内

Kali Linux 优化过程

修改输入法横向候选字 vim ~/.config/fcitx/conf fcitx-classic-ui.config 修改此行 为 false  :VerticalList=False   mb这玩意百度真不好找  fuck一句 web版酷狗 http://forum.ubuntu.org.cn/viewtopic.php?t=287968 Netspeed显示当前网络上传下载速度 apt-get install netspeed Alt+鼠标右键面板选择Add to Panel,添加nets

从一道趣味题目学习正则表达式

前天做了陈皓的趣味竞赛题目(fun.coolshell.cn),一直卡在第四道题目回文猫处不知所以然,看了微博上的提示,知道需要用正则表达式,但是不确定使用表达式的模式和原文,下面是第四道题的截图和链接,不看解析,你可以想到通关的办法吗? 看了答案,才知道source藏在网页的html源码中,曾经有过去看源码的念头,想作者不会这么geek吧,结果...就在源码中,下面是需要搜寻的网页的源码: <!-- h8:[email protected]:V<7Q3:]iqbn58\YoLGtweZus;