abc056d <贪心 / 二分+DP+bitset>
1.abc306e <mutiset的使用>2.abc053d <简单贪心>3.abc042d <组合数>4.abc043d5.abc045d6.abc044d <根号分治>7.abc046d8.abc047d9.abc048d <博弈>10.abc049d <并查集>11.abc050d <???>12.abc051 <多源最短路>13.abc052d14.abc054d <dp, 背包>15.abc055d <枚举>
16.abc056d <贪心 / 二分+DP+bitset>
17.abc057d <贪心+组合计数>18.abc058d <公式化简>19.abc059d <博弈, 打表找规律>20.abc060d <dp, 背包>21.abc061d <单源最短路, spfa, 判断负环>22.abc062d <优先队列>23.abc063d <二分答案>24.abc064d <贪心/前缀和>25.abc309f <线段树 + 离散化 + 双指针>26.abc309e <dfs>27.abc065d <贪心+最小生成树> [lambda表达式]28.abc066d <组合>29.abc067d <博弈 + dfs>30.abc068d <思维 + 构造>31.abc069d <构造>32.abc070d <简单树上dfs>33.abc071d <递推>34.abc072d <贪心>35.abc073d <Floyed + 枚举排列>36.abc074d <Floyed 消除传递边>37.abc075d <暴力枚举 / 枚举+离散化+二维前缀和>38.abc076d <dp / 贪心>39.abc077d <思维 + 最短路 (将构造数字过程视为最短路)>40.abc078d <博弈>41.abc079d <Floyed>42.abc080d <区间重叠>43.abc081d <思维 构造>44.abc082d <bitset 状压dp>45.abc083d <思维 贪心>46.abc084d <素数筛 前缀和>47.abc085d <贪心>48.abc086d <二维前缀和 同余>49.abc087d <并查集 维护距离信息>50.abc088 <bfs 最短路>51.abc089 <前缀和>52.abc310d <dfs暴搜-分组方案数 / bitmask表示集合+dp>53.abc310e <公式递推(dp?)>54.abc310f <dp + bitmask>55.abc090d <枚举计数>56.abc312c <二分答案>57.abc312d <dp, 括号匹配方案数>58.abc312e <暴力>59.abc320f <dp >60.abc092d<构造,思维>61.abc094d<组合数>62.abc095d<思维>63.abc096d<素数筛,整除>64.abc097d<并查集,排列>65.abc098d<双指针,异或>66.abc099d<dfs,枚举排列方案>67.abc100d<枚举>68.abc101d<打表,数学>https://atcoder.jp/contests/abc056/tasks/arc070_b
solution1: 贪心
// https://atcoder.jp/contests/abc056/tasks/arc070_b
// 查到多种做法 二分 / dp ...
// 参考 https://blog.csdn.net/sdz20172133/article/details/90739645
// 这里是贪心做法
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 5e3 + 10;
int a[N];
void solv()
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + 1 + n);
int pos = lower_bound(a + 1, a + 1 + n, k) - a - 1;
int ans = pos;
for (int i = 1; i <= pos; i++)
{
int s = 0;
for (int j = pos; j; j--)
{
if (i == j || s >= k - a[j]) continue;
s += a[j];
if (s >= k - a[i])
{
ans --;
break;
}
}
}
cout << ans << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T = 1;
// cin >> T;
while (T--)
{
solv();
}
return 0;
}
solution2: DP
注意这种DP的属性值为bool值的情况, 使用bitset优化效果极佳!
bitset使用+DP优化案例参考传送门
// https://atcoder.jp/contests/abc056/submissions/me
// 二分 + DP + bitset优化DP
// check0 为不用bitset优化的DP,
// check1 为使用bitset的DP,
// 二者耗时实测相差约30倍
#include <iostream>
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;
typedef long long LL;
const int N = 5e3 + 10;
int a[N];
int n, k, pos;
// DP进行检查
// 1058ms, 6524KB
bool check0(int x)
{
if (a[x] >= k) return true;
// 检查 a[1~pos] 除去 a[x] 外, 能否凑出 k-a[x] ~ k-1 中的数,
// 如果可以, 则 a[x] 为必须的元素, 反之不必须(返回false)
vector<vector<bool>> f(pos+1, vector<bool>(k+1, false));
f[0][0] = true;
// 考虑前i个元素(不含第x个), 能否凑出数字j
for (int i = 1; i <= pos; i ++)
{
for (int j = 0; j < k; j ++)
{
f[i][j] = f[i][j] | f[i-1][j];
if (j >= a[i] && i != x) f[i][j] = f[i][j] | f[i-1][j-a[i]];
}
}
// 检查dp结果
for (int i = k-a[x]; i < k; i ++) if (f[pos][i]) return true; // 必须
return false; // 非必需
}
// 用bitset对DP进行优化
// 理论上将时间复杂度 /32, 实测也确实如此
// 31ms, 3656KB
bool check1(int x)
{
if (a[x] >= k) return true;
bitset<N*2> f; // 默认初始化每位都为0
f.set(0); // 令f[0] = 1;
// 仅使用1维, 这是对check0中的dp的滚动优化
// 因为这里的bitset是将 N*2 位同时进行操作的, 因而也无需备份
// 注意更新顺序与check0不同, 这里展开写成check0的形式是 f[i][j+a[i]] |= f[i-1][j] ,
// 不过因为bitset的运算, 可以直接将j这一维度同时进行计算, 也就是用 ' <<a[i] ' 表示了 ' +a[i] '
for (int i = 1; i <= pos; i ++)
if (i != x)
f |= f << a[i];
// 检查dp结果
for (int i = k-a[x]; i < k; i ++) if (f[i]) return true;
return false;
}
void solv()
{
cin >> n >> k;
for (int i = 1; i <= n; i ++) cin >> a[i];
sort(a+1, a+1+n);
// 找到 a[i] >= k 的位置, 这样的a[i]一定是必须的
pos = lower_bound(a+1, a+1+n, k) - a;
int l = 1, r = pos;
// 找到第一个必要的元素 [... , 其左侧均为非必要元素
while (l < r)
{
int mid = (l + r) / 2;
if (check1(mid)) r = mid;
else l = mid + 1;
}
int ans = l - 1; // a[l~n] 为必须元素, 因而非必需元素为 a[1~l-1]
cout << ans << endl;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T = 1;
// cin >> T;
while (T --)
{
solv();
}
return 0;
}
本文来自博客园,作者:O2iginal,转载请注明原文链接:https://www.cnblogs.com/o2iginal/p/17496394.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧