博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Timus 1515
阅读量:5140 次
发布时间:2019-06-13

本文共 1265 字,大约阅读时间需要 4 分钟。

#include 
using namespace std; #define MAX 10000 int origin[101] = {
0}; typedef struct range_st {
int l,r; } range_st, *range_t; int ranges_len = 0; range_st ranges[MAX]; range_st temp[MAX]; void union_range(range_st rg) {
int i,j,union_count; for(i=0;i
= ranges[j].l) { //self-union occur if(ranges[i].r < ranges[j].r) ranges[i].r = ranges[j].r; union_count++; } } ranges_len -= union_count; } void update_range(int n) {
int temp_len = 0; range_st rg; for(int i=0;i
>N; for(i=0;i
>origin[i]; rg.l = rg.r = 0; ranges[ranges_len++] = rg; //init range (0,0) for(i=0;i
1) break; } ret = ranges[0].r + 1; cout<
<

囧死的一题目,给出N个数(N<=100),求一个最小的数,这个数不能是这N个数的任何组合的求和数。

暴力的思维让我去计算所以组合数,根据前i个数生成的所有和数,去计算第i+1个数能够生成的和数,然后把这两堆和数做合并,这可以正确地求出所有可能的和数,但就死活ME,因为数量太大了。注意给出的N个数,每个数最大值是10^6。

在使用第i个数的时候,其实就可以从集合中遍历,查看是否存在一个数少于Ni并且不在集合中,如果是,那么这个就是答案,但写的代码过不了,一直WA 3。

后来换了个思维,通过在草稿上写了些例子,认为这题目应该有很高效的计算方法才是,结果就得出了最后AC的代码。属于0开销代码。

作出的改变是把生成的和数集合中,连续的和数表示成范围,这样处理数据的数量级就大减,并且当发现存在两个不连续的范围后,就能马上得出答案。

转载于:https://www.cnblogs.com/klzwj1988/archive/2011/08/05/2128586.html

你可能感兴趣的文章
SpringBoot整合SpringData和Mysql数据库
查看>>
C++ 构造函数后加冒号
查看>>
centos7下安装mysql8.0
查看>>
npm源设置
查看>>
eclipse中定位引用的源码
查看>>
windows之电脑开机出现 this product is covered by one or more of the following prtents
查看>>
数据库冗余是否必要
查看>>
split()分割字符串用法
查看>>
modish产品介绍
查看>>
servlet 启动加载配置文件及初始化
查看>>
Beautiful Soup模块
查看>>
实验四
查看>>
OGNL
查看>>
win32 treeview
查看>>
day01
查看>>
【转】linux mknod命令解析
查看>>
SharePoint 2010/2013 隐藏的速度下拉菜单列表项
查看>>
NYOJ 24 素数的距离问题
查看>>
[leetcode]sort list
查看>>
Codeforces 444A DZY Loves Physics(图论)
查看>>