第一次做三分法,昨天晚上被边界问题折么了好久,初学三分的话一定要好好想想这个边界问题。
题解:三分法,一共有两种装备,并且这两种装备的权值是一样的,这里叫做装备A和装备B,把r设为最多能做多少件装备A。
check函数为:已知装备A的件数,看看剩下的材料能做多少件装备B,返回能做件数的总数。
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1010;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
int x,y;
int check(int n){
return n+min((x-2*n)/4,y-3*n);
}
int main(){
int t;
cin>>t;
while (t--){
cin>>x>>y;
int l=0,r=min(x/2,y/3);
int ans=0;
while (l<=r){
int mid1=l+(r-l)/3;
int mid2=r-(r-l)/3;
if(l==r){
ans=check(l);
break;
}
if(check(mid1)>check(mid2)){
ans=check(mid1);
r=mid2-1;
}
else l=mid1+1;
//cout<<l<<" "<<r<<endl;
}
cout<<ans<<endl;
}
return 0;
}

京公网安备 11010502036488号