原题:ZOJ 3681 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3681

题意:给一个m,n,m表示m个人,可以把m个人分成k组,每组m/k个人,人数要一样,如果超过一半的组支持Italy的话,说明这n个人都支持Italy.同时又可以把这k组中任意一组或多组再继续往下分,假设再把m/k分成p组,如果这p组中有超过一半的组支持Italy的话,说明m/k是支持Italy的,如此类推。给定有n个人支持Italy,问能否使看起来这m个人都支持Italy。并求求最少需要多少人支持Italy,才能确保这m个人都支持Italy.

做法:DFS出使看起来m个人都支持Italy所需的最小人数,然后与n比较,如果res<=n则能达到,否则不能达到。

DFS时,枚举其约数(因为要分成人数相等的组),然后分下去再DFS。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <map>
using namespace std;
#define N 1007 std::map<int, int> ans; int DFS(int m)
{
if(ans.count(m))
return ans[m];
int mini = m/+;
for(int i=;i*i<=m;i++)
{
if(m%i == )
{
mini = min(mini,((m/i)/+)*DFS(i));
mini = min(mini,(i/+)*DFS(m/i));
}
}
ans[m] = mini;
return ans[m];
} int main()
{
int n,m;
ans.clear();
while(scanf("%d%d",&m,&n)!=EOF)
{
int res = DFS(m);
if(res <= n)
puts("Yes");
else
puts("No");
printf("%d\n",res);
}
return ;
}

最新文章

  1. 常用Jquery插件整理
  2. 多字段 java对象排序
  3. linux 2.6.37-3.x.x x86_64
  4. Frenetic HelloSDNWorld
  5. 用VB把xls转换为xlsx
  6. 浅谈MVC页面之间参数传递
  7. 命令操作MySQL数据库
  8. C# string contains 不区分大小写
  9. C#进度条简单应用
  10. 关于azkaban上传job压缩包报错问题的解决方案
  11. [Redis]Redis的五种数据类型与键值/服务器相关命令
  12. 非常好的 gdb tui 的文章
  13. 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
  14. Spring注解 @Configuration
  15. LeetCode 88. 合并两个有序数组
  16. 基于py3和pymysql的数据库查询,查询某几列的数据
  17. QTcpSocket 发送和接收数据的几种方法
  18. Linux下用mail 命令给163邮箱发送邮件!
  19. foo()与@foo()的区别
  20. Linux文件属性和权限管理

热门文章

  1. Java多线程--wait(),notify(),notifyAll()的用法
  2. NLog在.NET Core Console Apps中的简单应用
  3. c++之函数重载(函数匹配)
  4. 关于C#中Environment.OSVersion判断操作系统及Win10上的问题
  5. ABAP程序系统字段中英文详解
  6. SarePoint Powershell Add user to Group
  7. PHP读取Excel文件内容
  8. Android 自定义带刻度的seekbar
  9. Android根据APP包名启动应用
  10. float类型转对象 对象转float类型(一)