zzuli 1432(二进制特点)

1432: 背包again

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 222  Solved: 65

SubmitStatusWeb Board

Description

Gy最近学习了01背包问题,无聊的他又想到了一个新的问题,给定n个物品的价值,和01背包一样,每个物品只能选1次或0次,求最小不能被得到的价值。

Input

第一行一个正整数T(T <= 100),表示有T组数据。

每组数据输入格式如下:

第一行为一个正整数N(N<=100),表示物品个数。

第二行N个正整数,表示每个物品的价值vi(1<=vi<=1000000)

Output

共输出T行,即每组数据相应答案。

Sample Input

2
3
2 4 8
4
1 2 4 8

Sample Output

1
16

可恶的数学题!

不难发现,类似于背包的二进制分解,1,2,4,8。......2^n,

对于这类连续的二的次方数,只要是下一个次方数以内的数,均可以用这几个书中的某几个表示出来;

例如    1,2,4,8  则16(不包含16) 以内的数均可以用这几个数表示;

所以打表出这些数,然后与比对,注意坑:要将数据先sort完之后再比对!!!!坑死我了

最后在筛查一下,对于大于maxn的数不必再考虑,找到小于maxn的数后,就让其加上这个值,因为maxn以内的值均可以表示了,

如果再出现一个小于maxn的数a,则maxn+a以内的数也就都可以表示了。

如果a大于maxn的话最小能表示的也是maxn+1还是没maxn小,所以不必考虑。

#include<bits/stdc++.h>
using namespace std;
int p[105]={1};
int main()
{
int t,i,j,n,k,a[105];
for(i=1;i<=27;++i) p[i]=p[i-1]*2;

cin>>t;
while(t--){int maxn=1;
cin>>n;
for(i=1;i<=n;++i) cin>>a[i];
sort(a+1,a+n+1);
for(i=1,j=0;i<=n;++i) if(a[i]==p[j]) {maxn=p[j+1];a[i]=0;++j;}

for(i=1;i<=n;++i){
if(a[i]&&a[i]<maxn) maxn+=a[i];
}
cout<<maxn<<endl;
}
return 0;
}

时间: 2024-10-03 14:45:10

zzuli 1432(二进制特点)的相关文章

python中 将你的名字转化成为二进制并输出

1 name = "吴彦祖" 2 for i in name: 3 i_by = bytes(i, encoding = "utf-8") 4 for i_bin in i_by: 5 i_b = bin(i_bin) 6 print(i_b) 输出结果: 0b10110100 0b10100110 0b10010110 我们来详细解读每个转换步骤:for i in name: 通过for循环获取所有的字符i,共获取了3个字符 i_by = bytes(i, enc

JavaScript 二进制的 AST

本文和大家分享的主要是javascript中二进制的 AST相关内容,一起来看看吧,希望对大家学习javascript有所帮助. 背景介绍 多年来,JavaScript 已经从最慢的脚本语言之一,从老爷车发展为兰博基尼,不管是通过 Web 浏览器还是其他环境.它都能够快到可以运行桌面.服务器.移动甚至嵌入式应用程序. 随着 JavaScript 的增长,应用程序的复杂程度和规模都越来越复杂.然而,二十年前,少数使用过 JavaScript 的网站也就加载几千字节的 JavaScript,许多网站

二进制

题目链接:here 对于 n 瓶一升的水,把他们合并后,最少需要的瓶子数为 n 的二进制中 1 的个数.假 设 n 的二进制中 1 的个数大于 k,那么我们要找到 1 个大于 n 的数,且二进制中 1 的个数等 于 k 的最小的数 m,那么答案为 m-n. 假设 n 二进制中,最右边的 1 在第 i 位(这里的第几位是从右往左数的,最右边为第 0 位),那么假设你加上一个小于 2^i 的数,结果二进制中 1 的个数只会增加,如果加上一个 2^i,则结果二进制中 1 的个数必定不会增加.所以只需要

zzuli oj 1134 字符串转换

题目链接: https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1134 Description 输入一个以回车结束的字符串,它由数字和字母组成,请过滤掉所有非数字字符,然后将数字字符串转换成十进制整数后乘以2输出. Input 输入一个以回车结束的字符串,长度不超过100,由数字和字母组成. Output 将转换后的整数乘以2输出,测试数据保证结果在int范围内. Sample Input sg987aa65t498 Sample Output 1

判断给定十进制整数的二进制形式中含有几个1

两种判断一个给定整数的二进制形式中含有几个1的简单方法: 主要思想是通过按位与(&)运算和位移运算(<< >>)实现 1 unsigned int_number( int n) 2 { 3 if (n < 0) 4 return; 5 unsigned count = 0; 6 while (n != 0) 7 { 8 if ((n & 1) != 0) 9 ++count; 10 n >>= 1; 11 } 12 return count; 13

二进制思惟以及数据的存储

我们平常运用的数字多是由 0~9 共十个数字构成的,例如 1.9.10.297.952 等,一个数字最多能表现九,假如要表现十.十一.二十九.一百等,就需求多个数字组合起来.例如表现 5+8 的后果,一个数字不敷,只能"进位",用 13 来表现:这时"进一位"相当于十,"进两位"相当于二十.由于逢十进一,也由于只要 0~9 共十个数字,所以叫做十进制(Decimalism).进制也就是进位制.在停止加法(减法)运算时,逢X进(借)一就是X进制,这

使用C#向Sql Sever中存取网络图片和本地图片(二进制流的形式)

先是做普通的,存储我们本地的图片,将它转化为二进制流存储到数据库对应的表中. 代码如下: string path = "../../A.jpg"; FileStream fs = new FileStream(path, FileMode.Open); int streamLength = (int)fs.Length; //获取文件流的长度. byte[] image = new byte[streamLength]; //声明字节数组,用于保存图片文件 fs.Read(image,

centos6.5二进制安装mysql

[[email protected] ~]# yum install libaio-devel -y    #安装共享库 [[email protected] ~]# wget http://mirrors.sohu.com/mysql/My ... ux2.6-x86_64.tar.gz #下载MySQL二进制包 [[email protected] ~]# tar xf mysql-5.5.48-linux2.6-x86_64.tar.gz #解压二进制包 [[email protected

Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题是线段树成段更新,但是不能直接更新,不然只能一个数一个数更新.这样只能把每个数存到一个数组中,长度大概是20吧,然后模拟二进制的位操作.仔细一点就行了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath>