zl程序教程

您现在的位置是:首页 >  其他

当前栏目

UVALive 6858——分类讨论&&水题

amp 分类 讨论 水题 UVALive
2023-09-27 14:27:45 时间

题目

链接

题意:对于一个$n \times m$的矩阵的最外一圈,问是否能用$k \times 1$的方块填满

分析

考虑左右两边的情况,分类讨论,切记考虑所有可能的情形。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n, m;
 5 
 6 bool judge(int k)
 7 {
 8     if(k == 1)  return true;
 9     if(k == 2)
10     {
11         if(n % 2)
12         {
13             if((m-1) % k == 0)  return true;
14             if((m-2) % k == 0 && m % k == 0)  return true;
15         }
16         else
17         {
18             if((m-2) % k == 0)  return true;   //两边放满
19             if(m % k == 0)  return true;        //两边都不放满
20             if((m-1) % k == 0)  return true;    //一边放满,一边不放满
21         }
22     }
23     else
24     {
25         if(n % k == 0)
26         {
27             if((m-2) % k == 0)  return true;
28             //if(m % k == 0)  return true;
29         }
30         if(n % k == 1)
31         {
32             //printf("%d %d %d\n", n, m, k);
33             if((m-1) % k == 0)  return true;        //两边对齐
34             if((m-2) % k == 0 && m % k == 0)  return true;  //两边交错
35         }
36         if(n % k == 2)
37         {
38             if(m % k == 0)  return true;
39         }
40     }
41     return false;
42 }
43 
44 int main()
45 {
46     while(scanf("%d%d", &n, &m) == 2)
47     {
48          int T;
49          scanf("%d", &T);
50         while(T--)
51         {
52             int tmp;
53             scanf("%d", &tmp);
54             if(judge(tmp))  printf("YES\n");
55             else  printf("NO\n");
56         }
57     }
58     return 0;
59 }