现在的位置: 首页 > 综合 > 正文

方砖问题

2013年10月14日 ⁄ 综合 ⁄ 共 1354字 ⁄ 字号 评论关闭

/*

Problem description

用边长小于N的正方形方砖(注意,不要求所有的方砖大小相同,请看样例说明)不重叠地铺满N*N的正方形房间,最少要几块方砖。

Input

第一行是一个整数T,表示测试数据的组数,接下来的T 行,每一行是一个N(2<=N<=100)

Output

对于每一组测试数据输出一行,为最少需要的块数。

Sample Input

2
4
5

Sample Output

4
8

*/

#include <iostream>

using namespace std;

 

int GetNum(int m,int n)

{

   int a=0;

   if (n==0)

   {

      return 0;

   }

   a += m/n;

   a += GetNum(n,m%n);

   return a;

}

 

int main()

{

   int T,N,temp,sum = 0,k=0;

   //freopen("10086.txt","r",stdin);

   cin>>T;

   int *pRes = new int[T];

   while (k<T)

   {

      cin>>N;

      if (N%2==0)

      {

        pRes[k]=4;

        k++;

        continue;

      }

      if (N%3==0)

      {

        pRes[k]=6;

        k++;

        continue;

      }

      sum = N*N;

      for (int i=N/2+1;i<N;i++)

      {

        temp = 0;

        temp += GetNum(N,i);

        temp += GetNum(N,N-i);

        if (sum > temp)

           sum = temp;

      }

      pRes[k]=sum;

      k++;

   }

   for (int t=0;t<T;t++)

      cout<<pRes[t]<<endl;

   //fclose(stdin);

   return 0;

}

 

#include <stdio.h>

#define MAX_N 100

 

int n;

int f[MAX_N+1][MAX_N+1];

 

int min( int a, int b )

{

   if( a < b )

      return a;

   else

      return b;

}

 

int CalF( int x, int y )

{

   int res, k;

 

   if( ( x == y ) && ( x < n ) )

      return 1;

   else {

      res = 100000;

      for( k = ( x / 2 ); k < x; k++ )

        res = min( res, f[k][y] + f[x-k][y] );

      return res;

   }

}

 

void work()

{

   int x, y;

 

   for( x = 1; x <= n; x++ )

      for( y = 1; y <= n; y++ ) {

        f[x][y] = CalF(x,y);

        f[y][x] = f[x][y];

      }   

}

 

void main()

{

   for( n = 2; n <= MAX_N; n++ ) {

      work();

      printf("%5d %5d/n",n,f[n][n]);

   }

}

【上篇】
【下篇】

抱歉!评论已关闭.