poj3977 Subset 中途相遇法...

科技中介服务机构想要提升服务效率,需要哪些数智工具支持?.docx 科技中介服务机构想要提升服务效率,需要哪些数智工具支持? 立即下载

http://poj.org/problem?id=3977

嗯WA了10次……一道难度不是很大但细节很要命的题


给定一个有n个数的集合,求这个集合的一个绝对值最小非空子集,有多解时子集的元素个数最小。

关键就是在于这个非空....


枚举出一边的集合的时候,自然的要将相同子集和的子集只留下集合元素个数最小的一个,除了子集和为0的以外,子集和为0的还要保留次小。

二分的时候要判断很多很麻烦,所以把±3范围内的所有情况都统计了一遍。


#include <iostream>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <cstdio>
#include <set>
#include <map>
#include <algorithm>
#define N 100005
typedef long long LL;
using namespace std;
int n , m , p;
LL a[40];
pair<LL , int> s[1 << 17] , t[1 << 18];
LL aabs(LL x) {return x > 0 ? x : -x;}
map<int , LL> h;
void work()
{
  h.clear();LL ans = 9223372036854775807LL , x; int sum , i , j , y , k;
  for (i = 0 ; i < n ; ++ i)
    cin >> a[i];
  m = n >> 1 , memset(s , 0 , sizeof(s)) , memset(t , 0 , sizeof(t));
  for (i = 0 ; i < m ; ++ i)
    h[1 << i] = a[i];
  for (i = 1 ; i < 1 << m ; ++ i)
    s[i].first = s[i & (i - 1)].first + h[i & -i] , s[i].second = s[i & (i - 1)].second + 1;
  sort(s , s + (1 << m));
  p = 0 , h.clear() , s[p ++] = s[0];
  for (i = 1 ; i < 1 << m ; ++ i)
    if (s[i].first > s[p - 1].first || !s[p - 1].first && !s[p - 1].second && !s[i].first)
      s[p ++] = s[i];
  for (i = 0 ; i < n - m ; ++ i)
    h[1 << i] = a[m + i];
  for (i = 0 ; i < 1 << (n - m) ; ++ i)
  {
    if (i) t[i].first = t[i & (i - 1)].first + h[i & -i] , t[i].second = t[i & (i - 1)].second + 1;
    k = lower_bound(s , s + p , make_pair(-t[i].first , -1 << 30)) - s;
    for (j = max(0 , k - 3) ; j < min(p , k + 4) ; ++ j)
      if (y = s[j].second + t[i].second)
      {
        x = aabs(s[j].first + t[i].first);
        if (x < ans) ans = x , sum = y;
        else if (x == ans && y < sum)
          sum = y;
      }
  }
  cout << ans << ' ' << sum << endl;
}

int main()
{
  while (scanf("%d",&n) , n)
    work();
  return 0;
}


UE5 AI寻路全攻略:从Nav Mesh基础到动态障碍与多模式导航 在游戏开发中,AI寻路是赋予非玩家角色自主移动能力的关键技术。其核心原理是通过预计算或实时生成一个表示可行走区域的导航网格,AI路径查找算法(如A*)在此网格上规划最优路径。这项技术的价值在于,它能极大提升游戏世界的真实感和交互性,使NPC能够智能地绕开障碍、穿越复杂地形,广泛应用于开放世界、RPG、策略游戏等多种场景。本文聚焦于虚幻引擎5的寻路系统,深入探讨其寻路网格体配置。针对动态环境挑战,文章详细介绍了如何利用寻路修饰体积和动态障碍物组件实现导航网格的实时更新;同时,针对游泳、飞行等特殊移动需求,解析 阅读详情

相关推荐

[ESP32S3N16R8][LVGL8.3.0][IDF5.2.3]ST7701S RGB屏幕驱动[vscode最详细配置]

ST7701S ESP32S3 基于ESP-IDF5.2.3编写,编程环境为vscode。本教程详细讲述了esp32s3配置st7701s屏幕驱动以及gt911触摸驱动并关联到lvgl8.3.0,使用IDF5.23示例rgb_panel进行测试删除了其里面的屏幕驱动,改为单独编写屏幕和触摸驱动,最后完成了实列。

qq_44022379的博客 2608

POJ - 3977 Subset (折半枚举)

题目链接 题意:在一个集合中找到一个非空子集使得这个子集元素和的绝对值尽量小,和绝对值相同时保证元素个数尽量小 1.折半枚举,先分成两部分,第一部分用二进制枚举所有情况,并记录在数组中,数组中应该记录两个元素,一个是每种情况的      元素之和,另一个是有多少个元素相加。 2.  记录完之后,排序,元素和一样的,更新第二个数据(有多少元素相加),取最少的元素。 3. 之后再枚举另一半,在...

Top_xiao的博客 334

华为使用MicroG安装并使用Google服务教程

鉴于众多华为手机用户因无法使用Google服务而感到不便,我经过多次摸索和测试,总结了一份简单易懂的教程,希望能够帮助到大家。无论是需要使用Google Play商店下载应用,还是需要使用Google服务进行工作和学习,本文将详细介绍如何在华为手机上安装并使用Google服务。二、前置条件软件要求:Aurora Store(替代Google Play商店)、MicroG Companion、MicroG Server(替代Google框架)

weixin_41926602的博客 3万+

POJ 3977 Subset (简单折半枚举)

题意:n个数选若干个,使他们和的绝对值最小,如果存在多个解,选择所选的个数最少的。题解:n为35,枚举所有情况肯定超时,可以枚举一半然后二分找另一半。#include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;stdio.h&gt; #include &lt;algorithm&gt; #include &lt;math.h&g...

阿狸的博客 323

数据结构之博弈树搜索(深度优先搜索)

数据结构之博弈树搜索(深度优先搜索)

LucianaiB的博客 1526

软件产品国际化:前后端及App多语言版本解决方案(超详细实现过程)

多语言版本解决方案是应对全球化趋势的关键策略,它通过构建灵活且可扩展的架构,支持软件产品在不同语言和文化环境下的顺畅运行与展示。此方案涵盖了前端多语言界面实现、后端多语言数据处理及大数据环境下的多语言支持等多个层面,确保公司能够高效地推出适应全球用户多样化需求的软件产品。在前端多语言界面实现方面,解决方案采用了国际化与本地化的结合方法。国际化过程确保软件的功能和代码设计能够处理多种语言和文化习惯,而本地化则针对特定地区进行界面和内容的调整。

大模型大数据攻城狮的专栏 2754

POJ 3977 折半枚举

题意 传送门 POJ 3977 取绝对值最小的和,且集合大小最小。 将数据集合折半枚举所有状态,一半排序后在另一半枚举时进行二分。一般而言用大于等于以及小于当前枚举数据和的相反数 −sum-sum−sum 的值进行更新即可,并保证非空集且元素个数最小。考虑到空集的和为 000,在 sum=0sum=0sum=0 的时候要特殊处理。 #include <cstdio> #include ...

neweryyy的博客 306

微信小程序 - 超详细小程序接入腾讯地图的完整流程,提供地图显示、IP 属地定位、地理位置名称、获取经纬度等超多功能示例(可一键复制并运行的功能源代码,详细的注释及常见问题汇总)小白直接上手!

微信小程序腾讯地图怎么接入,小程序项目中使用腾讯地图sdk,小程序中使用腾讯地图,微信小程序集成腾讯地图功能,微信小程序通过ip获取其地址、经纬度、详细地址,小程序使用腾讯地图跨域解决方法,微信小程序引入腾讯地图详细教程,原生小程序引入腾讯地图,微信小程序如何植入腾讯地图,微信小程序腾讯地图配置及使用详细教程,小程序植入腾讯地图SDK,微信小程序项目怎么用腾讯地图,微信小程序IP属地定位,获取当前用户位置名称,微信小程序如何使用腾讯地图获取用户的定位位置,在小程序中使用腾讯地图,实现定位,距离计算,实时搜索

🏆 前端领域优质创作者 8808

poj3977(折半搜索)

点击打开题目链接 多数据集,每个数据集给出不超过35个数,求其中非空子集使得该子集数字和的绝对值最小。 如果有多个这样的子集,取元素数目最少的。 最后输出该子集中数字的和的绝对值,以及子集所含元素数目。 35个数,容易想到折半,对半分开搜索,这样的话对于某一半的序列单纯枚举各数选与不选,差不多 就是2^17种,复杂度显然可以接受。 这道题思路就是前一半先搜完(各个元素枚

lixiaomu2的博客 692

1位2路选择器设计

1位2路选择器设计

好好学习,天天向上 3578

SAP 中配置权限职责菜单并分配给用户的核心流程是:用PFCG 创建 / 维护角色(含菜单、事务码、权限)→ 生成权限参数文件 → 通过 SU01/SU10 将角色分配给用户

SAP权限配置核心流程:1)通过PFCG创建角色,配置菜单事务码及权限对象;2)生成权限参数文件;3)用SU01/SU10分配角色给用户。关键步骤包括:在PFCG中维护菜单结构、设置权限字段值、生成Profile,通过用户比较验证权限。批量分配可用SU10,特殊需求可创建复合角色或自定义权限对象。常见问题需检查权限缺失(SU53)、菜单分配及组织级别设置。流程简化为:创建角色→配置权限→分配用户→验证生效。

金牌架构师 1274

Poj 3977 Subset 折半枚举 超大背包

http://poj.org/problem?id=3977题意:从一个集合(有正有负)里挑选若干个数字(数字个数不能为0),求挑选出来的数字的和的绝对值的最小值,数字个数注意事项:注意这道题的数据范围和对空集的处理,且运用了离散化的思想AC代码:#include #include#include #include #include #include #include #include#inclu

smilesundream的博客 595

索尼IMX316 标定_ToF模块相机校准

很多东西一开始给出去的并不是最优的方案,而是在客户端支持中,以及在持续不断的芯片验证中,发现还可以这么做,还能够再提升Sensor的性能,所以说这是一个持续的过程。曾经听说过一个故事,在某厂里ST产品一直作为第一供应商多年,然后近段时间即将被新兴公司的ToF产品所打败,性能报告已经出来,但是ST并没有更新产品,而是在原有产品更新了固件以及标定流程,此时产品的性能又是超越其他供应商的产品。相机矩阵不考虑镜头失真,因为理想的针孔相机没有镜头。为了准确地代表一个真实的相机,相机模型包括径向和切向的镜头畸变。

dream it possible 1155

poj3977Subset (折半枚举)

题目链接:https://vjudge.net/problem/POJ-3977 题目大意:选取集合中的元素,然后进行加和,输出最小的绝对值 题目思路:参考学长的标程参考半天,用到了中途相遇法,还有一个比较重要的东西就是集合的整数表示。 代码: #include #include #include #include #include using namespace std; typedef

china震震的博客 334

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

POJ3977-Subset

35个数字意味着2^35种可能性,穷举是不可能的,因此我们采用二分搜索。 首先枚举一半的可能性存入map容器中,并不断更新答案,因为有可能这一部分中的答案就是最后的答案。同样枚举另一半的可能性,更新答案,但是要注意与上一部份的答案相结合。#include <cstdio> #include <map> #include <algorithm>using namespace std;typedef

Collider 445

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

POJ 3977 Subset

Subset Time Limit: 30000MS Memory Limit: 65536K Description Given a list of N integers with absolute values no larger than 1015, find a non empty subset of these numbers which minimizes the absolute ...

忘梦心的博客 365

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

poj3977

题目意思很好懂。一共有n个数字,选择其中的几个数字组成一个集合,使得它们的和的绝对值最小,输出这个集合的规模以及最小的那个绝对值。 n最大35,假设用暴力,那就是1<<35,这个数实在是太大了,所以我们选择用 折半+二分查找。即首先我们选择其中的一半数据(称为mid),然后计算出其中所有数据的集合情况,一共有1 << mid种。接着我们遍历n-mid那一部分的数据,选择一个合适的数,来放入之前的集

leohujx的博客 435

poj 2718 Smallest Difference(dfs枚举水过)

Given a number of distinct decimal digits, you can form one integer by choosing a non-empty subset of these digits and writing them in some order. The remaining digits can be written down in some orde

坏坏的薯片 308

POJ3977 Subset 折半枚举

折半枚举,减小问题的规模。

LoveKobe_的专栏 1378

POJ 3977 Subset 已翻译

描述 给定绝对值不大于1015的N个整数的列表,找到这些数的非空子集,其最小化其元素的和的绝对值。 如果有多个子集,请选择具有较少元素的子集。 输入 输入包含多个数据集,每个数据集的第一行包含N 输入以N = 0结束 输出 对于输入中的每个数据集打印两个整数,最小绝对和和最优子集中的元素数。 

woniupengpeng的专栏 432

POJ 3977 Subset (折半枚举)

题意:让你从n个数里面找任意个数(>0),使他们的和的绝对值最小,输出最小和的绝对值和最小个数。 分析:       分成两份,分别枚举。  #include #include #include #include #include #include #include #include #include #include #include #include #inclu

Follow My Heart 626

poj 3977 Subset

题意:在一个集合中找到一个非空子集使得这个子集元素和的绝对值尽量小,和绝对值相同时保证元素个数尽量小 分析:1.二分枚举的思想,先分成两个集合;    2.枚举其中一个集合中所有的子集并且存到数组中,并排序;    3.枚举另一个集合中所有的子集并且与第一个集合中的合适子集相加(可以通过二分查找在数组中找到最合适的元素)   4.这个题特别坑的地方是不能用abs库函数,只能手写,竟然写宏定

c337134154的专栏 1170

【POJ 3977】【折半枚举】【超大背包】Subset【暑期 No.7】

题意:         给一串数字,选取其中的数字,使其值最小,并且选取数字的个数尽可能少.   分析:         因为数字范围很大,因此不能使用动态规划来计算,从而考虑折半枚举来进行计算。         将这串数字划分为两部分,第一部分用字典序枚举的方式输出所有的可能结果,将结果输入数组,再对数组进行升序。        再对该串数字的另一部分,进行字典序枚举,对于每一种可能...

lucius-liu.cn 526

poj 3977 折半枚举二分搜索

题意: 从n(35)个数字(有正有负)中取出一个非空子集,使得其和的绝对值最小。 若最小的绝对值有多组,则选择非空子集元素个数最少的。 解析: 折半来枚举。 将35分成两半,第一半状态压缩,然后用map离散化每个sum和num。 然后第二半还是状态压缩完了在map里面找最接近-sum的数。 ps,真是超级喜欢hankcs的c++代码风格。 - - 12s

渐近自由 497
上一篇: poj3484 Showstopper 二分
下一篇: poj3109 Inner Vertices 扫描线+树状数组
Sd_无心插柳
博客等级 码龄14年 39粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值