解题思路:要你构造一个01正方形矩阵,矩阵需要满足1不能相邻,且矩阵对称,给你一个n ,问你包含n个1的最小正方形矩阵边长为多少。
解题思路:1和3的情况需要特殊考虑,只有奇数可以实现这样的摆放 ,枚举奇数,把奇数矩阵分成4块求最大可放置矩阵。
解题代码:
1 // File Name: 201a.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月10日 星期二 20时15分18秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 int dp[105]; 28 int mx[105]; 29 int main(){ 30 int n ; 31 scanf("%d",&n); 32 dp[1] = 1; 33 dp[2] = 3; 34 dp[4] = 3; 35 dp[5] = 3; 36 for(int i = 5;i <= 30;i +=2) 37 { 38 int t = i /2; 39 mx[i] = (t/2)*4 + 1; 40 int k ; 41 if(t % 2 == 0 ) 42 k= t*t *2; 43 else 44 k=((t/2+1)*(t/2+1) + (t/2)*(t/2))*4; 45 mx[i] +=k; 46 for(int j =1 ;j <= min(mx[i],100) ;j ++) 47 { 48 if(dp[j] == 0 ) 49 { 50 dp[j] = i ; 51 } 52 } 53 } 54 printf("%d ",dp[n]); 55 return 0; 56 }