联想专卖店大促销 (AC代码 和解释)

首先贴出大佬题解及代码网站  https://blog.csdn.net/HowardEmily/article/details/72855976
我的解释写在代码注释里了

大佬的代码和思路都好6,这个题解就应该多看多背吧

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio> 

using namespace std;
vector<int>vtt;
int a,b,c;
int judge(int x)
{
    vtt.clear();//处理数据前不要忘记将上一组数据清空
    int aa=a-x;
    if(aa<0)    return 0;
    int bb=b-x;
    if(bb<0)    return 0;
    vtt.push_back(aa);
    vtt.push_back(bb);
    vtt.push_back(c);
    sort(vtt.begin(),vtt.end());
    if(vtt[0]+vtt[1]+min( (vtt[0]+vtt[1]+1),vtt[2] )<x)
       return 0;
    else
       return 1;
}
int main()
{
    int T;
    int l,r,mid;
    int ans=8;
    scanf("%d",&T);
    for(int i=0;i<T;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        l=0;r=1e5;//之所以l要从0开始,是因为U盘鼠标机械键盘他们的组合就是一种礼包都凑不出来,emmm就是这么坑
        while(l<=r)//之所以要小于等于是因为l=r这个点也要进行judge判断
        {
            mid=(l+r)/2;
            if(judge(mid))
            {
                ans=mid;
                l=mid+1;//因为想要有更多的方案
            }
            else
                r=mid-1;//现在尝试的方案x值太大了,缩小些
        }
        printf("%d\n",ans);
    }
    return 0;
}

然后,大佬有一句话我不明白

“没想到是二分,以为是记忆化搜索,可是记忆化搜索的话我们一般求的是有多少种排列的种数吧.”

猜你喜欢

转载自blog.csdn.net/qq_41764621/article/details/80719248
今日推荐