CodeForces-626C Block Towers 二分例题 & 贪心
2017-08-12 01:53
441 查看
题目链接:
CodeForces-626C
大意:
给两个数字 n,m。 求构造出 n 个 2 的倍数,m 个 3 的倍数,数字各不相同,求最大值的最小值。
思路:
用二分的方法确定。
2. [b]是否有可行的判断条件。[/b]
对于这道题,简单判断来看,对应出的 “构造出 n 个 2 的倍数,m 个 3 的倍数”这个解都有多个,而解集中有一个最小的,就是答案,而下一个解集对应的最小值,又比这个答案大。
所以答案是单调递增。满足单调性(
是否存在可行的判断条件,画一个 2 和 3 倍数的韦恩图。(借用卿学姐的图)
num1 是 2 的倍数,
num2 是 3 的倍数,
num3 是 4 的倍数。
贪心地考虑。2 尽量选取 num1 部分,3 尽可能由 num3 部分来。
判断意义在于:构造过程中存在一些 3 是由 num3 来的。
得到以下代码
加上附加判断 num1>=n && num2>=m
得到
具体实现:
CodeForces-626C
大意:
给两个数字 n,m。 求构造出 n 个 2 的倍数,m 个 3 的倍数,数字各不相同,求最大值的最小值。
思路:
用二分的方法确定。
首先确定题目能否用二分思想:
1. [b]是否满足单调性.[/b]2. [b]是否有可行的判断条件。[/b]
对于这道题,简单判断来看,对应出的 “构造出 n 个 2 的倍数,m 个 3 的倍数”这个解都有多个,而解集中有一个最小的,就是答案,而下一个解集对应的最小值,又比这个答案大。
所以答案是单调递增。满足单调性(
是否存在可行的判断条件,画一个 2 和 3 倍数的韦恩图。(借用卿学姐的图)
num1 是 2 的倍数,
num2 是 3 的倍数,
num3 是 4 的倍数。
二分判断问题经常是贪心
构造选取 2 的时候尽量选取 num1 部分,给 3 的构造留下充足的空间。剩余的为 num1-n贪心地考虑。2 尽量选取 num1 部分,3 尽可能由 num3 部分来。
判断意义在于:构造过程中存在一些 3 是由 num3 来的。
得到以下代码
if(min(num3,num1-n)>=m-(num2-num3)) return true;
加上附加判断 num1>=n && num2>=m
得到
bool check(int x){ int num1=x/2; int num2=x/3; int num3=x/6; if(num1<n) return 0; if(num2<m) return 0; if(min(num3,num1-n)>=m-(num2-num3)) return 1; return 0; }
二分模板:
int l=maxl,r=maxr,ans; while(l<=r){ int mid=(l+r)/2; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; }
具体实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(s,t) memset(s,t,sizeof(s))
//#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
//#define LOCAL
inline void read(int &x){
x=0;char p=getchar();
while(!(p<='9'&&p>='0'))p=getchar();
while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();
}
int n,m;
bool check(int x){ int num1=x/2; int num2=x/3; int num3=x/6; if(num1<n) return 0; if(num2<m) return 0; if(min(num3,num1-n)>=m-(num2-num3)) return 1; return 0; }
int main() {
#ifdef LOCAL
freopen("1012.in","r",stdin);
freopen("out.txt","w",stdout);
#endif
read(n);read(m);
int l=0,r=1e7,ans;
while(l<=r){
int mid=(l+r)/2;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}
相关文章推荐
- 【二分答案 && 贪心】codeforces-847E Packmen
- CodeForces - 344E Read Time && CodeForces - 830A Office Keys 二分+贪心
- Codeforces 825D Suitable Replacement - 贪心 - 二分答案
- Codeforces 732D Exams【贪心+二分】
- Codeforces 373C:Counting Kangaroos is Fun(二分+贪心)
- HDU 4004 The Frog's Games(基本算法-贪心,搜索-二分)
- codeforces_679B. Bear and Tower of Cubes(贪心+二分+dfs)
- 51NOD 1421 最大MOD值&&Codeforces 484 B. Maximum Value(筛法 + 二分)
- Codeforces 913DToo Easy Problems (优先队列 & 贪心)
- !codeforces 399C Cards-数论&贪心-(暴力枚举)
- CodeForces 363D 【二分+贪心】
- 【二分查找&贪心】 ◆HihoCoder 1053◆ 居民迁移
- Codeforces 807E Prairie Partition 贪心思维+二分
- CodeForces 670D2 Magic Powder - 2(二分+贪心)
- HDU 4343 多查询求区间内的最大不相交区间个数-思维&贪心-卡时间&二分&剪枝
- Codeforces 831D Office Keys 二分+贪心
- Codeforces Round #424 -(二分&贪心)||dp-D. Office Keys
- CodeForces 614D 二分+贪心
- 二分&&贪心--Block Towers
- CodeForces 377B Preparing for the Contest 贪心(二分加优先队列)