第一次做三分法,昨天晚上被边界问题折么了好久,初学三分的话一定要好好想想这个边界问题。
题解:三分法,一共有两种装备,并且这两种装备的权值是一样的,这里叫做装备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; }