题意: 题意有点难表述,请恕我语文水平不好。有n个人他们分在一组,如果其中支持意大利队的人多于一半,那么这组就是一个合法组,同时我们可以说这n个人都支持意大利队。如果这n个人所在的组是非法组,那么你可以把这组继续拆分。比如拆成m组,如果这m组中多于一半是合法组那么这n个人所在组依然算是合法组。题目的规则就是这样。问:给你M个人其中有N个意大利队球迷,能不能满足条件,使得我们可以说这M个人都是支持意大利的,并输出最少需要多少个意大利球迷在这M个人中。
思路: 对于n个人,我们只需求出最小的球迷数Min和N比较下就能得出答案。而求Min可以dfs记忆化搜一下,把n的所有可能分组情况遍历一遍。
代码:
#include<stdio.h>
#include<map>
using namespace std;
map<int,int> ans;
int dfs(int n)
{
int Min=n/2+1;
if(ans.count(n))
return ans[n];
for(int i=2;i*i<=n;i++){
if(n%i==0){
Min=min(Min,((n/i)/2+1)*dfs(i));
Min=min(Min,(i/2+1)*dfs(n/i));
}
}
ans[n]=Min;
return Min;
}
int main()
{
int n,m,min;
while(~scanf("%d %d",&n,&m)){
min=dfs(n);
if(min<=m) puts("Yes");
else puts("No");
printf("%d\n",min);
}
return 0;
}