Topcoder SRM 654 DIV1 500 FoldingPaper2 递归 + 枚举
2015-04-13 17:15
573 查看
题意:给你一张长W,宽H 的纸,问你能不能者成给定的大小, 每一次折纸只能折成整数大小。
解题思路:递推+枚举 枚举给定大小的长和宽,然后套进 W,H中求最小值 , 折纸策略最优是每次折半。
解题代码:
View Code
解题思路:递推+枚举 枚举给定大小的长和宽,然后套进 W,H中求最小值 , 折纸策略最优是每次折半。
解题代码:
// BEGIN CUT HERE /* */ // END CUT HERE #line 7 "FoldingPaper2.cpp" #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <queue> #include <stack> #include <fstream> #include <numeric> #include <iomanip> #include <bitset> #include <list> #include <stdexcept> #include <functional> #include <utility> #include <ctime> using namespace std; #define PB push_back #define MP make_pair #define REP(i,n) for(i=0;i<(n);++i) #define FOR(i,l,h) for(i=(l);i<=(h);++i) #define FORD(i,h,l) for(i=(h);i>=(l);--i) typedef vector<int> VI; typedef vector<string> VS; typedef vector<double> VD; typedef long long LL; typedef pair<int,int> PII; int find(int now,int val) { if(now == val) return 0 ; if(val > now/2) return 1; if(now % 2 == 0 ) return 1 + find(now/2,val); return 1 + find(now/2+1,val); } class FoldingPaper2 { public: int solve(int W,int H, int A) { int mi = 1e9; int ok = 0 ; for(int i = 1; i <= sqrt(A) + 1;i ++) { if(A % i == 0 ) { if(i <= W && A/i <= H) { mi = min(find(W,i)+find(H,A/i),mi); ok = 1; } if(i <= H && A/i <= W) { mi = min(find(H,i)+find(W,A/i),mi); ok = 1; } } } if(ok) return mi ; else return -1; } // BEGIN CUT HERE public: void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); if ((Case == -1) || (Case == 4)) test_case_4(); if ((Case == -1) || (Case == 5)) test_case_5(); } private: template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); } void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } } void test_case_0() { int Arg0 = 5; int Arg1 = 3; int Arg2 = 12; int Arg3 = 1; verify_case(0, Arg3, solve(Arg0, Arg1, Arg2)); } void test_case_1() { int Arg0 = 2; int Arg1 = 2; int Arg2 = 3; int Arg3 = -1; verify_case(1, Arg3, solve(Arg0, Arg1, Arg2)); } void test_case_2() { int Arg0 = 4; int Arg1 = 4; int Arg2 = 1; int Arg3 = 4; verify_case(2, Arg3, solve(Arg0, Arg1, Arg2)); } void test_case_3() { int Arg0 = 127; int Arg1 = 129; int Arg2 = 72; int Arg3 = 8; verify_case(3, Arg3, solve(Arg0, Arg1, Arg2)); } void test_case_4() { int Arg0 = 1; int Arg1 = 100000; int Arg2 = 100000; int Arg3 = 0; verify_case(4, Arg3, solve(Arg0, Arg1, Arg2)); } void test_case_5() { int Arg0 = 1; int Arg1 = 1; int Arg2 = 2; int Arg3 = -1; verify_case(5, Arg3, solve(Arg0, Arg1, Arg2)); } // END CUT HERE }; // BEGIN CUT HERE int main() { FoldingPaper2 ___test; ___test.run_test(-1); return 0; } // END CUT HERE
View Code
相关文章推荐
- TopCoder SRM 645 Div2 Problem 500 - ConnectingCars (枚举)
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
- TopCoder SRM 661 Div2 Problem 500 - BridgeBuildingDiv2 (枚举 + 状态压缩)
- TopCoder SRM 654 Div2 Problem 500 - OneEntrance (思维)
- topcoder SRM 654 DIV2 1000 SuccessiveSubtraction2 题解(dp)
- Topcoder: Problem Statement SRM 39 DIV1 500 Point
- 小朋友学TopCoder(8):SRM726 DIV2 500-point
- TopCoder SRM 650 Div2 Problem 500 - TaroFillingAStringDiv2 (DP)
- TopCoder SRM 727 Div2 500-point TwoDiagonals
- TopCoder SRM 655 Div2 Problem 500 - FoldingPaper2 (思维)
- TopCoder SRM 681 Div. 2 Problem 500 - ExplodingRobots (枚举)
- TopCoder SRM 633 Div2 Problem 500 - Jumping
- TopCoder SRM 634 Div2 Problem 500 - ShoppingSurvey
- Topcoder SRM 663 Div2 Problem 500 - ABBA 解题报告
- Topcoder SRM 543 DIV2 1000 EllysThreeRivers & DIV1 500 EllysRivers
- Topcoder SRM 636 Div2 1000(切蛋糕,最后一块给自己。最小值中求最大值,二分+枚举)
- TopCoder SRM 653 Div2 Problem 500 - RockPaperScissorsMagicEasy (DP)
- topcoder srm 500 div1
- Topcoder SRM 582 DIV2 500
- Topcoder SRM 619 DIv2 500 --又是耻辱的一题