【Luogu】【关卡1-8】BOSS战-入门综合练习2(2017年10月)【AK】------都是基础题

P1426 小鱼会有危险吗

我个人觉得这个题目出的不好,没说明白,就先只粘贴的AC代码吧

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main() {
 5     double s, x;
 6     cin >> s >> x;
 7     double start = s - x, endd = s + x; //探测器的范围
 8     double speed = 7.0, length = 0.0;
 9     //没有游到探测器范围之前
10     while(length < start) {
11         length += speed;
12         speed *= 0.98;
13     }
14     if (length + speed > endd) {
15         cout << "n" << endl;
16     }
17     else {
18         cout << "y" << endl;
19     }
20 
21     return 0;
22 }
View Code

P1464 Function

对于一个递归函数w(a,b,c)

如果a<=0 or b<=0 or c<=0就返回值1.

如果a>20 or b>20 or c>20就返回w(20,20,20)

如果a<b并且b<c 就返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)

其它别的情况就返回w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1)

这是个简单的递归函数,但实现起来可能会有些问题。当a,b,c均为15时,调用的次数将非常的多。你要想个办法才行.

/*

absi2011 : 比如 w(30,-1,0)既满足条件1又满足条件2

这种时候我们就按最上面的条件来算

所以答案为1

*/

解答:记忆化,直接用个数组存了。

一开始全WA, 我还没想通为啥,后来发现有个条件是【如果a>20 or b>20 or c>20就返回w(20,20,20)】

这个放在一开始的主函数判断里面了,但是如果这个数比20大,就把这个数字=20.

但是假如这个元组是 (25, 3, 2) ------> 正确答案是 (20, 20,20)

如果按照我当时的算法就是 (25,3,2) ------> 就会变成 (20,3,2) 就会去计算这个数。

还有个错误点就是又踩内存了... 访问||更新数组之前一定要判断下标是否能取到。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int w[25][25][25] = {0};
 6 
 7 int cal(int a, int b, int c) {
 8     if (a <= 0 || b <= 0 || c <= 0) {
 9         return 1;
10     }
11     if (a > 20 || b > 20 || c > 20) {
12         return cal(20, 20 ,20);
13     }
14     if (w[a][b][c] != -1) {
15         return w[a][b][c];
16     }
17     if (a < b && b < c) {
18         w[a][b][c] = cal(a, b, c-1) + cal(a, b-1, c-1) - cal(a, b-1, c);
19         return w[a][b][c];
20     }
21     w[a][b][c] = cal(a-1,b,c) + cal(a-1,b-1,c) + cal(a-1,b,c-1) - cal(a-1,b-1,c-1);
22     return w[a][b][c];
23 }
24 
25 int main() {
26     memset(w,0xFF,sizeof(w));
27     long long a, b, c;
28     cin >> a >> b >> c;
29     while (a != -1  || b != -1 || c != -1) {
30         int a1 = a > 20 ? 21 : a;
31         int b1 = b > 20 ? 21 : b;
32         int c1 = c > 20 ? 21 : c;
33         int ans = cal(a1, b1, c1);
34         if (a1 >= 0 && b1 >= 0 && c1 >= 0) {
35             w[a1][b1][c1] = ans;
36         }
37         printf("w(%lld, %lld, %lld) = %d
", a, b ,c, ans);
38         cin >> a >> b >>c;
39     }
40     return 0;
41 }
View Code

P1014 Cantor表

我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…输出表中的第N项

解答:找规律发现第一行1个数,第二行2个数,第三行3个数...等差数列。注意下细节就好。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main() {
 6     int n;
 7     cin >> n;
 8     int summ = 0, lines = 0;
 9     while(n > summ) {
10         ++lines;
11         summ += lines;
12     }
13     summ -= lines;
14 
15     int left = n - summ;
16 
17     int fenfu, fenzi;
18     if (lines % 2 == 0) {
19         fenfu = lines + 1, fenzi = 0;
20         for (int i = 1; i <= left; ++i) {
21             fenfu--; fenzi++;
22         }
23     } else {
24         fenfu = 0, fenzi = lines + 1;
25         for (int i = 1; i <= left; ++i) {
26             fenfu++; fenzi--;
27         }
28     }
29     cout << fenzi << "/" <<fenfu << endl;
30     return 0;
31 }
View Code
原文地址:https://www.cnblogs.com/zhangwanying/p/7663002.html