Educational Codeforces Round 89 (Div. 2) A. Shovels and Swords (贪心,二分)

题目传送门:Codeforces

题目大意:

制作一个铁锹需要两根木棍和一颗钻石,制作一把剑需要两颗钻石和一根木棍。每一个铁锹或剑都可以换一个祖母绿宝石,现在给a个木棍和b个宝石,问最多可以得到多少个宝石。

思路:

这道题虽然需要确定的因素比较多,但只要确定了其中一个因素,剩下的因素就确定了。比如,确定用x个木棍来制作剑,在满足条件的情况下,需要2x个钻石,剩下的材料都用来制作铁锹。
所以,我们只需要得到获得最多宝石时所对应的x,就可以得到答案。获得宝石的多少是由a和b中较小的一个决定,a=5,b=7与a=7,b=5所得到的答案是一样的。在求解x过程中,我们尽可能x的值更大,我们对x值进行二分求最大。x最小为0,最大是 min(a,b), 当确定x个木棍的某个状态后,只要所对应钻石的使用有富余,就可以使用更多的x,反之,更少的x,在这个过程中确定获得宝石的最大值,一定把 min(a,b) 用完。

代码如下:
#include 
using namespace std;
const int Max=1e6+7;
#define ll long long
int a,b;

int main() {
    int T; scanf("%d",&T);
    while(T--){
  	scanf("%d%d",&a,&b);
 	int ans=0;
  	if(a>b) swap(a,b);
  
  	int l=1,r=a;
  	while(l<=r){
   	    int mid=(l+r)/2;
   	    // mid个木棍来制作剑 
   	    int t=(a-mid)/2+mid*2; // 剑和铁锹需要t颗钻石
   	    if(t<=b) {
    	        ans=max( ans, (a+mid)/2 );
    	        l=mid+1;
  	    }else{
                r=mid-1;
   	    }
  	}  
   	cout<<ans<<endl;
       } 
       return 0;
}

你可能感兴趣的:(Codeforces)