
二分、三分、01分数规划
qq_41854014
这个作者很懒,什么都没留下…
展开
-
POJ3273 Monthly Expense
一开始没思路, 参考了下别人的思路.链接: link.思路: 这个最大值一定是在n份钱中最大的那一份与所有n份钱的总和之间。因此在n份钱最大的那一份与n份钱的总和之间进行二分运算。算法:check: 对n份钱进行累加,如果累加结果超过mid,就新开一组。累加结束后,对比所开的组数group与m的大小对比.二分:如果group大于m,说明组开多了,mid偏小;反之,说明组开少了,mid偏大。然后通过二分的方式,逐渐找到最优的mid,即为最大值最小的分法中最大值的值。#include <ios转载 2020-06-30 10:49:44 · 132 阅读 · 0 评论 -
POJ2785 4 Values whose Sum is 0
算法分析:正常的暴力肯定过不了.1.不是有四个数相加吗,我们可以看成是两个数加两个数,然后就可以将两个数的所有组合放到一个数组里面, 再排序。2.再判断另外两个数的组合时,对上面的两个组合进行二分查找。这样就快了很多了。#include <iostream>#include <algorithm>#include <vector>using namespace std;typedef long long ll;#define IOS ios::sync_原创 2020-06-29 20:20:27 · 207 阅读 · 0 评论 -
NC16597 聪明的质监员
思路分析:若要|y-s|的值越小,则y跟s越接近越好.二分check:若y>s, 则减小y, 根据检验公式可知需要增大m;若y<s, 则增大y, 需要减小m.这样可以让y跟s不断的接近.检验公式的计算可以通过前缀和优化.#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull; typedef long double ld;co原创 2020-06-29 17:36:09 · 137 阅读 · 0 评论 -
NC24866 Music Notes
前缀和+二分.#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull; typedef long double ld;const ll mod = 1e9 + 7;const double PI = acos(-1.0);const double eps = 1e-10;const ll inf = 1e18;const int maxn =原创 2020-06-22 11:31:25 · 185 阅读 · 0 评论 -
NC19913 [CQOI2009]中位数图
将>b的置为1;<b的置为-1.pos记录b的位置.算法:1.在0~pos-1, 从后往前扫, sum记录后缀和, 若sum=0, ans++, 记录sum的个数:cnt[maxn+sum]++;2.在pos+1~n-1, 同上.3.在0~n-1,步骤2中,同时记录sum的值,并且可以统计与步骤一种sum的相反结果,ans +=cnt[maxn-sum].#include <bits/stdc++.h>using namespace std;typedef long long l原创 2020-06-21 10:46:55 · 132 阅读 · 0 评论 -
NC15446 wyh的物品
0/1分数规划入门题.#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod = 1e9 + 7;const double PI = acos(-1.0);const double eps = 1e-10;const ll inf = 1e18;double ans = 0;int n, k;inline ll read(){ ll s = 0, w = 1;原创 2020-06-17 15:57:31 · 216 阅读 · 0 评论 -
NC14733 完全平方数
题意很简单,求[l,r]范围内的完全平方数个数,0<= l <= r <= 1000000000;因为sqrt(1000000000)=31622,所以可以写一个0-31622的递增数组,在这个数组里二分找答案.找一个左边界L使得L²>=l,再找一个右边界使得R²>r,答案就是R-L#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod = 1e9 + 7原创 2020-06-17 14:22:51 · 174 阅读 · 0 评论 -
NC23049 华华给月月准备礼物
首先分析能不能用二分.二分的条件:满足单调性和check答案比较简单.单调性:可以二分长度, 显然是满足单调性的.check:1.每次二分木棍的长度mid, 然后对每个a[i] 都能得到 a[i] / mid 个需要的木棍.2.我们check一下能不能得到超过k个所需木棍.3.直接统计满足条件的最大长度即可.注意:最后的答案可能为0.#include <bits/stdc++.h>using namespace std;typedef long long ll;const原创 2020-06-17 11:30:50 · 148 阅读 · 0 评论