首先贴出大佬题解及代码网站 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;
}
然后,大佬有一句话我不明白
“没想到是二分,以为是记忆化搜索,可是记忆化搜索的话我们一般求的是有多少种排列的种数吧.”