BOSS战-入门综合练习2

P1426 小鱼会有危险吗

题目描述

有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%。有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是探测范围。一旦小鱼进入探测器的范围,探测器就会在这一秒结束时把信号传递给那个猎人,猎人在一秒后就要对探测器范围内的水域进行抓捕,这时如果小鱼还在这范围内就危险了。也就是说小鱼一旦进入探测器范围,如果能在下1秒的时间内马上游出探测器的范围,还是安全的。现在给出s和x的数据,请你判断小鱼会不会有危险?如果有危险输出'y',没有危险输出'n'。

//感谢黄小U饮品完善题意

输入输出格式

输入格式:

 

一行内输入两个实数,用空格分隔,表示s和x。均不大于100

 

输出格式:

 

一行内输出'y'或者'n'表示小鱼是否会有危险。

 

输入输出样例

输入样例#1: 复制
14 1
输出样例#1: 复制
n
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     double v=7,s,x,l=0;
 5     cin>>s>>x;
 6     while(l<s-x){
 7         l+=v;
 8         v*=0.98;
 9     }
10     if(v<=s+x-l)cout<<'y';
11     else cout<<'n';
12 }

P1464 Function

题目描述

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

  • 如果 a \le 0a0 or b \le 0b0 or c \le 0c0 就返回值 11 .
  • 如果 a>20a>20 or b>20b>20 or c>20c>20 就返回 w(20,20,20)w(20,20,20)
  • 如果 a<ba<b 并且 b<cb<c 就返回 w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)w(a,b,c1)+w(a,b1,c1)w(a,b1,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)w(a1,b,c)+w(a1,b1,c)+w(a1,b,c1)w(a1,b1,c1)

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

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

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

所以答案为1

*/

输入输出格式

输入格式:

 

会有若干行。

并以 -1,-1,-11,1,1 结束。

保证输入的数在 [-9223372036854775808,9223372036854775807][9223372036854775808,9223372036854775807] 之间,并且是整数。

 

输出格式:

 

输出若干行,每一行格式:

w(a, b, c) = ans

注意空格。

 

输入输出样例

输入样例#1: 复制
1 1 1
2 2 2
-1 -1 -1
输出样例#1: 复制
w(1, 1, 1) = 2
w(2, 2, 2) = 4

说明

记忆化搜索

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll rpt[25][25][25];
 5 ll w(ll a,ll b,ll c)
 6 {
 7     if(a<=0||b<=0||c<=0) return 1;
 8     else if(rpt[a][b][c]!=0) return rpt[a][b][c];
 9     else if(a>20||b>20||c>20) rpt[a][b][c]=w(20,20,20);
10     else if(a<b&&b<c) rpt[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
11     else rpt[a][b][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);
12     return rpt[a][b][c];
13 }
14 int main()
15 {
16     ll a,b,c;
17     while(scanf("%lld%lld%lld",&a,&b,&c)==3){
18         memset(rpt,0,sizeof(rpt));
19         if(a==-1&&b==-1&&c==-1) break;
20         printf("w(%lld, %lld, %lld) = ",a,b,c);
21         if(a>20) a=21;
22         if(b>20) b=21;
23         if(c>20) c=21;
24         printf("%lld\n",w(a,b,c));
25     }
26     return 0;
27 }

P1014 Cantor表

题目描述

现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:

1/11/1 , 1/21/2 , 1/31/3 , 1/41/4 , 1/51/5 , …

2/12/1 , 2/22/2 , 2/32/3 , 2/42/4 , …

3/13/1 , 3/23/2 , 3/33/3 , …

4/14/1 , 4/24/2 , …

5/15/1 , …

… 我们以 ZZ 字形给上表的每一项编号。第一项是 1/11/1 ,然后是 1/21/2 , 2/12/1 , 3/13/1 , 2/22/2 ,…

输入输出格式

输入格式:

 

整数 NN ( 1≤N≤100000001N10000000 )

 

输出格式:

 

表中的第 NN 项

 

输入输出样例

输入样例#1: 复制
7
输出样例#1: 复制
1/4
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int sum;
 5 int main(){
 6     scanf("%d",&n);
 7     sum=(int)((-1.0+sqrt(1.0+8*n*1.0))/2.0);
 8     int t=sum*(sum+1)/2;
 9     if(t<n){
10         sum++;
11         if(sum%2==0){
12             printf("%d/%d\n",n-t,sum-(n-t-1));
13         }
14         else{
15             printf("%d/%d\n",sum-(n-t-1),n-t);
16         }
17     }
18     else{
19         printf("%d/%d\n",1,sum);
20     }
21 } 

 

posted on 2018-07-24 16:48  大海浩瀚  阅读(240)  评论(0)    收藏  举报

导航