#include <cstdio>
class wall
{
public:
int H,W,N,D[30];
wall();
int count(int h = -1,int w = -1);
};
wall::wall()
{
scanf("%d %d",&H,&W);
scanf("%d",&N);
for (int n = 0; n < N; n++)
scanf("%d",D+n);
D[N] = 0;
// for (int n = 0; n < N+1; n++) printf("%d ",D[n]);
// printf("\n");
}
int wall::count(int h, int w)
{
int tmp,r = 0,R[30],mul,i,m;
if (h == -1) h = H;
if (w == -1) w = W;
if (h == 0 || w == 0) return 0;
if (h < w)
{
tmp = h;
h = w;
w = tmp;
}
tmp = w;
i = N-1;
while (i >= 0 && tmp < D[i]) i--;
m = D[i];
// printf("Lower = %d Max_fit = %d\n",tmp,D[i]);
for (i = 0; i < N; i++) R[i] = 0;
i = N-1;
while (i >= 0 && tmp > 0)
{
while (i >= 0 && tmp < D[i]) i--;
if (i < 0) return -1;
R[i] += tmp / D[i];
// printf("Counting R (for h=%d w=%d): %d / %d = %d\n",h,w,tmp,D[i],R[i]);
tmp %= D[i];
}
// printf("For h=%d w=%d\n",h,w);
// for (i = 0; i < N; i++) printf("%d ",R[i]);
// printf("\n");
r = 0;
for (i = N-1; i >= 0; i--)
{
if (D[i] >= m) mul = 1; else mul *= D[i+1] / D[i];
// printf("R=%d D[i+1]=%d D[i]=%d R[i]=%d mul=%d\n",r,D[i+1],D[i],R[i],mul);
r += mul * R[i];
}
return r + count(h-m,w);
}
/////////////////////////////////////
int main()
{
wall X;
printf("%d\n",X.count());
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <cstdio> class wall { public: int H,W,N,D[30]; wall(); int count(int h = -1,int w = -1); }; wall::wall() { scanf("%d %d",&H,&W); scanf("%d",&N); for (int n = 0; n < N; n++) scanf("%d",D+n); D[N] = 0; // for (int n = 0; n < N+1; n++) printf("%d ",D[n]); // printf("\n"); } int wall::count(int h, int w) { int tmp,r = 0,R[30],mul,i,m; if (h == -1) h = H; if (w == -1) w = W; if (h == 0 || w == 0) return 0; if (h < w) { tmp = h; h = w; w = tmp; } tmp = w; i = N-1; while (i >= 0 && tmp < D[i]) i--; m = D[i]; // printf("Lower = %d Max_fit = %d\n",tmp,D[i]); for (i = 0; i < N; i++) R[i] = 0; i = N-1; while (i >= 0 && tmp > 0) { while (i >= 0 && tmp < D[i]) i--; if (i < 0) return -1; R[i] += tmp / D[i]; // printf("Counting R (for h=%d w=%d): %d / %d = %d\n",h,w,tmp,D[i],R[i]); tmp %= D[i]; } // printf("For h=%d w=%d\n",h,w); // for (i = 0; i < N; i++) printf("%d ",R[i]); // printf("\n"); r = 0; for (i = N-1; i >= 0; i--) { if (D[i] >= m) mul = 1; else mul *= D[i+1] / D[i]; // printf("R=%d D[i+1]=%d D[i]=%d R[i]=%d mul=%d\n",r,D[i+1],D[i],R[i],mul); r += mul * R[i]; } return r + count(h-m,w); } ///////////////////////////////////// int main() { wall X; printf("%d\n",X.count()); return 0; } |
English