Luogu关卡1-8BOSS战-入门综合练习2(2017年10月)
Posted zhangwanying
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu关卡1-8BOSS战-入门综合练习2(2017年10月)相关的知识,希望对你有一定的参考价值。
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 }
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\\n", a, b ,c, ans); 38 cin >> a >> b >>c; 39 } 40 return 0; 41 }
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 }
以上是关于Luogu关卡1-8BOSS战-入门综合练习2(2017年10月)的主要内容,如果未能解决你的问题,请参考以下文章