牛オフ練習試合59 C.合成装置(三分の一)

件名の説明:

そしてbは装置の部分3の材料を合成することができる二つの材料と牛肉xおよび材料のY B片と材料片は、装置はまた、物質4及び材料(B)を用いて合成することができます。牡牛座は、合成装置の数を最大化したいので、あなたは、ヘルプ牛肉になりました。

説明を入力します。

含むTの入力データセット
整数Tの最初のライン
各Tの整数をx、次の2行を、Y

出力説明:

各整数回答のデータ出力ライン。

エントリー

5
4 8
7 6
8 10
100 4555
45465 24124

輸出

2
2
3
50
13917

1 <= T <= 10000
1 <= X、Y <= 1E9

この質問は、あなたが生産設備、生産設備の第1の実施形態と数T1が列挙の最大数を検索することができ、(0 <= T1 <=分 (X / 2、Y / 3)) の第二の数を作るプログラムT2は分((X-2 * T1である )/ 4、Y-3 * T1)
我々は、T1 + T2 = T1 +分しようとしている( (X-2 * T1)/ 4、Y-3 * T1) 最大値

我々の直接暴力を列挙O(1E9 / 2)TLEの場合

私たちは、半分または三分の一を使用することができます

バイナリ適用、単調
バイナリ適用、またはモノトーン画像は、放物線(二次関数)であります

我々は、((X-2 * T1)/ 4、Y-3 * T1)=分((2 * T1 + X)/ 4、Y-2 * T1)T1 +分を分析しました

二つの方程式は時間の最小値を取るように見ることができ、T1 =(4 * Y-X)/ 4に等しい、彼は我々は、我々は極値の値がT1の範囲内にないかわからない、極端な値であります範囲を絞り込むための三分の一の使用を見つけ、そして最終的に暴力小さな範囲を横断しようとしています。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<set>
#include<sstream>
using namespace std;
typedef long long ll;
const ll maxn=1e6+10;
const ll inf=0x3f3f3f3f3f3f3f3f;
ll solve(ll t1,ll x,ll y)//第二件装备个数 
{
    return min((x-2*t1)/4,y-3*t1);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    ll t;
    cin>>t;
    while(t--)
    {
        ll a,b;
        cin>>a>>b;
        ll l=0,r=min(a/2,b/3);//三分找第一种装备件数
        while(l<r)
        {
            ll lm=l+(r-l)/3;
            ll rm=r-(r-l)/3;
            if(l==lm&&r==rm) break;//防止死循环
            if(lm+solve(lm,a,b)<=rm+solve(rm,a,b))
                l=lm;
            else
                r=rm;
        } 
        ll ans=0;
        for(int i=l;i<=r;i++)
        {
            ans=max(ans,i+solve(i,a,b));
        }
        cout<<ans<<endl;
     } 
    return 0;
}
公開された88元の記事 ウォン称賛30 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_43667611/article/details/104893506