博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Poj 3977 Subset 折半枚举 超大背包
阅读量:4112 次
发布时间:2019-05-25

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

题意:从一个集合(有正有负)里挑选若干个数字(数字个数不能为0),求挑选出来的数字的和的绝对值的最小值,数字个数<=35,数据范围<=10^15
注意事项:注意这道题的数据范围和对空集的处理,且运用了离散化的思想
AC代码:
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const long long inf = 1e17; struct Node{ ll v, l; }; Node node1[3000000], node2[3000000],nod[3000000]; ll a[40]; ll absx(ll a) { return a > 0 ? a : -a; } bool cmp(Node a, Node b) { if(a.v!= b.v) return a.v
1) { ll mid = (l + r) >> 1; if (nod[mid].v >= m) r = mid; else l = mid; } return r; } int main() { ll n; while (~scanf("%lld", &n)&&n) { for (ll i = 1; i <= n; i++) scanf("%lld", &a[i]); ll n1 = n / 2,n2=n-n1,minn = inf, mlen = 40;; ll cnt1 = (1<
temp) { minn=temp; mlen=node1[i].l; } else if(minn==temp&&mlen>node1[i].l) mlen=node1[i].l; } for (ll i = 1; i <=cnt2; i++) { node2[i].v = node2[i].l = 0; for (ll j = 0; j <=n2-1; j++) if (i&(1<
temp) { minn=temp; mlen=node2[i].l; } else if(minn==temp&&mlen>node2[i].l) mlen=node2[i].l; } sort(node2 + 1,node2 +cnt2+1, cmp); nod[1].v=node2[1].v; nod[1].l=node2[1].l; ll p=1; for(ll i=2;i<=cnt2;i++) if(node2[i].v!=nod[p].v) { ++p; nod[p].v=node2[i].v; nod[p].l=node2[i].l; } for (ll i = 1; i <=cnt1; i++) { ll m = node1[i].v; ll j = binary(-m,p); if (absx(m + nod[j].v)
node1[i].l + nod[j].l) mlen = node1[i].l + nod[j].l; j--; if(j==0) continue; if (absx(m + nod[j].v)
node1[i].l + nod[j].l) mlen = node1[i].l + nod[j].l; } printf("%lld %lld\n", minn, mlen); } return 0; }
第一次wa代码:
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; struct Node{ ll v, l; }; Node node1[3000000], node2[3000000]; int a[40]; ll absx(ll a) { return a > 0 ? a : -a; } bool cmp(Node a, Node b) { return a.v < b.v; } ll binary(int m, int n) { ll l = 0, r = n; while (r - l>1) { ll mid = (l + r) >> 1; if (node2[mid].v >= m) r = mid; else l = mid; } return r; } int main() { ll n; while (~scanf("%lld", &n)&&n) { for (ll i = 1; i <= n; i++) scanf("%lld", &a[i]); ll n1 = n / 2,n2=n-n1; ll cnt1 = (1<
node1[i].l + node2[j].l) mlen = node2[i].l + node2[j].l; j--; if (absx(m + node2[j].v)
node1[i].l + node2[j].l) mlen = node2[i].l + node2[j].l; } printf("%lld %lld\n", minn, mlen); } return 0; }

转载地址:http://nvgsi.baihongyu.com/

你可能感兴趣的文章
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>
day-03JavaSE_循环
查看>>
Mysql初始化的命令
查看>>
day_21_0817_Mysql
查看>>
day-22 mysql_SQL 结构化查询语言
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
HTML&CSS进阶
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>