CF 626C [Block Towers] 贪心
题目链接:http://codeforces.com/problemset/problem/626/C
题目大意: 有n个人用高度为2的砖往上搭,有m个人用高度为3的砖往上搭。每个人可用的砖块数是无限的,但是要求每个人搭的塔的高度,求所有可行情况中塔的最高高度的最小值。
关键思想:贪心,当且仅当高度为6的倍数时,他们的高度会相同。这时必须有一个人搭更高的,哪个人呢?此时就贪心;另外一种思想是数学的,首先答案x一定是大于等于2n也是大于等于3m的(有6的倍数取等号)对吧,而且m+n<=(x/2+x/3-x/6)【仔细想象是不是这样】。通过这个不等式求出符合要求的x的最小值。
代码如下:
//贪心 #include <iostream> using namespace std; int main(){ long long n,m; while(cin>>n>>m){ long long d1=2*n,d2=3*m; for(long long i=6;i<=min(d1,d2);i+=6){//i是6的倍数,它比终点小说明还有重复的情况。 if(d1<=d2){ d1+=2; }else{ d2+=3; }//贪心 } cout<<max(d1,d2)<<endl; } return 0; }
#include <cstdio> int main() { int i, a, b; scanf("%d%d", &a, &b); for (i = 0;; i++) if (i / 2 >= a && i / 3 >= b && i / 2 + i / 3 - i / 6 >= a + b) break; printf("%d", i); }
边完善自己边认识自己