码迷,mamicode.com
首页 > 其他好文 > 详细

2014 Super Training #9 C E - Cup 2 --记忆化搜索

时间:2014-07-12 15:18:56      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   2014   

原题: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。

代码:

bubuko.com,布布扣
#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/2+1;
    for(int i=2;i*i<=m;i++)
    {
        if(m%i == 0)
        {
            mini = min(mini,((m/i)/2+1)*DFS(i));
            mini = min(mini,(i/2+1)*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 0;
}
View Code

 

2014 Super Training #9 C E - Cup 2 --记忆化搜索,布布扣,bubuko.com

2014 Super Training #9 C E - Cup 2 --记忆化搜索

标签:style   blog   http   color   os   2014   

原文地址:http://www.cnblogs.com/whatbeg/p/3839735.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!