Why so serious? --[NKU]schindlerlee

2010年03月04日星期四.pku1395 && nwerc2001 Cog-Wheels 动态规划

2010年03月04日星期四.pku1395 && nwerc2001 Cog-Wheels 动态规划
这个题其实不难,首先将所有可能的比例用二重循环求出来,然后在1~10000范围内做dp,把所有
可能的乘积都求出来,然后再看看最后所求的比例化简之后得到的两个数是否都可达。

 1 const int N = 64;
 2 const int inf = 1 << 30;
 3 int num[N], n, m, qa, qb;
 4 const int M = 10010;
 5 bool stat[M];
 6 
 7 int gcd(int a, int b)
 8 {
 9     if (b==0return a;
10     return gcd(b,a%b);
11 }
12 
13 bool judge(int a, int b)
14 {
15   for (int i = 1; i * a < M && i * b < M; i++) {
16       if (stat[i * a] && stat[i * b]) {
17           return true;
18       }
19   }
20   return false;
21 }
22//http://www.cppblog.com/schindlerlee
23 int fac[M],top;
24 void pre()
25 {
26   int i, j, tmp;
27   scanf("%d"&n);
28   for (i = 0; i < n; i++) {
29       scanf("%d", num + i);
30   }
31   top = 0;
32   for (i = 0; i < n; i++) {
33       for (j = 0;j < n;j++) {
34           if (i == j) { continue; }
35           if (num[i] % num[j] == 0) {
36               fac[top++= num[i] / num[j];
37           }
38       }
39   }
40   stat[1= 1;
41   for (i = 0; i < top; i++) {
42       for (j = 1; j < M; j++) {
43           if (stat[j]) {
44               tmp = j * fac[i];
45               if (tmp < M) {
46                   stat[tmp] = 1;
47               }
48           }
49       }
50   }
51 }
52 
53 int main()
54 {
55   int testcase, testid, a, b;
56   scanf("%d"&testcase);
57   for (testid = 1; testid <= testcase; testid++) {
58       pre();
59       scanf("%d"&m);
60       printf("Scenario #%d:\n", testid);
61       while (m--) {
62           scanf("%d%d"&a, &b);
63           int d = gcd(a, b);
64           qa = a / d, qb = b / d;
65           if (judge(qa, qb)) {
66               printf("Gear ratio %d:%d can be realized.\n", a, b);
67           } else {
68               printf("Gear ratio %d:%d cannot be realized.\n", a, b);
69           }
70       }
71       putchar(10);
72       if (testid < testcase) {
73           memset(stat, 0sizeof(stat));
74       }
75   }
76 
77   return 0;
78 }
79 

posted on 2010-03-04 17:27 schindlerlee 阅读(1195) 评论(0)  编辑 收藏 引用 所属分类: 解题报告


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理