AtCoder Regular Contest 070 D - No Need 想法:利用单调性二分+bitset优化
/**
题目:D - No Need
链接:http://arc070.contest.atcoder.jp/tasks/arc070_b
题意:给出N个数,从中选出一个子集,若子集和大于等于K,则这是一个Good子集,现在要求这N个数里无用数的个数。
无用数的定义是:在这个数所属的所有Good子集中,如果把这个数删去后原子集仍然是一个Good子集,它就是一个无用数
思路:关键点是存在单调性,如果某个数是必须的,那么比他大的数都是必须的;
证明如下:假设x是必须的,y是比x大的某个数;x是必须的,即x和其他某些数合成的和s加起来为sum>=k,且这个总和sum是满足>=k的情况中最小的和;且s<k;
如果某些数包含了y,那么把y去掉后,肯定是sum-y<k;所以y是必须的。
如果某些数不包含y,那么把x去掉后,再加上y,肯定是>=k的,因为y>=x;
所以存在单调性。
这样就可以二分+bitset优化判断。(bitset用于求组合数的和)
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<bitset>
using namespace std;
const int maxn = ;
const int inf = 0x3f3f3f3f;
typedef long long ll;
int a[maxn];
int n , k;
int b[maxn];
bitset<maxn> dp;
int judge(int x)
{
if(a[x]>=k) return ;
///剔除当前数,剩余的数dp一发;存在性判断.
dp.reset();
dp[] = ;
for(int i = ; i < n; i++){
if(i==x) continue;
dp|=(dp<<a[i]);
}
for(int i = k-; i >= k-a[x]; i--){
if(dp[i]){
return ;
}
}
return ;
}
int solve()
{ sort(a,a+n);
/*
int lo = -1, hi = n;
while(hi-lo>1){
int m = (lo+hi)/2;
if(judge(m)) hi = m;
else lo = m;
}
return hi;
*/
int lo = , hi = n-;
int mas = -;///这里必须-1,因为我后面+1了,如果不这样的话,结果>=1;
while(lo<=hi){
int m = (lo+hi)/;
if(judge(m)) hi = m-;
else{
lo = m+;
mas = max(mas,m);
}
}
return mas+;///下标是mas,所以要再加一;
}
int main()
{
while(scanf("%d%d",&n,&k)==)
{
for(int i = ; i < n; i++){
scanf("%d",&a[i]);
}
printf("%d\n",solve());
}
return ;
}
AtCoder Regular Contest 070 D - No Need 想法:利用单调性二分+bitset优化的更多相关文章
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
- AtCoder Regular Contest 094
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...
- AtCoder Regular Contest 095
AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
- AtCoder Regular Contest 096
AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...
- AtCoder Regular Contest 097
AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...
随机推荐
- WPF在代码中创建DataTemplate时候的异常
今天写段程序用到了在代码中手动创建DataTemplate, var factory = new FrameworkElementFactory(typeof(OperationColumn)); ...
- u-boot支持LCD显示(基于TQ2440)
平台简介 Linux版本:Linux-3.14 u-boot版本:u-boot-2015.04 硬件:TQ2440(内存:64MB NandFlash:256MB) 作者:彭东林 邮箱:pengdo ...
- 下载谷歌浏览器(Chrome)扩展离线安装包crx文件最简单的方法
转:http://alyzq.com/?p=627 如果不会使用,请看下面的操作步骤 引言(可以不看): 下面介绍一下,下载谷歌浏览器(Google Chrome)扩展的离线安装包crx文件最简单的方 ...
- Ext js 应用例子
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 《Hadoop基础教程》之初识Hadoop 【转】
Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...
- tessellation 曲面细分 on Android
Mac OS X 10.8 (OpenGL 3.2), MacOSX 10.9 (OpenGL 3.2 to 4.1) Windows with NVIDIA since 2006 (GeForce ...
- Yii2系列教程七:Behaviors And Validations
这一篇文章的开头就无需多言了,紧接着上一篇的内容和计划,这一篇我们来说说Yii2的Behavior和Validations. Behavior 首先我们来说说Behavior,在Yii2中Behavi ...
- 【Git】Git hangs while unpacking objects (Windows)
Git hangs while unpacking objects (Windows) 14 Oct 2014 I'm not sure if this is because we're behind ...
- Private strand flush not complete错误
Private strand flush not complete错误 (2013-10-22 11:04:58) 转载▼ 分类: FAQ 最近的一个报表系统数据库,总是出现checkpoint ...
- 淘宝JAVA中间件Diamond
以下是转载自网上资料,但是根据步骤可以搭建出diamond配置中心服务器. 项目中需要用到diamond的理由是, 项目中使用了很多定时任务和异步任务.而且这些定时任务和异步任务都是分布式的安排在多个 ...