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