2014 Super Training #9 C E - Cup 2 --記憶化搜尋

來源:互聯網
上載者:User

標籤: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。

代碼:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <map>using namespace std;#define N 1007std::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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.