BOSS战-入门综合练习2
P1426 小鱼会有危险吗
题目描述
有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%。有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是探测范围。一旦小鱼进入探测器的范围,探测器就会在这一秒结束时把信号传递给那个猎人,猎人在一秒后就要对探测器范围内的水域进行抓捕,这时如果小鱼还在这范围内就危险了。也就是说小鱼一旦进入探测器范围,如果能在下1秒的时间内马上游出探测器的范围,还是安全的。现在给出s和x的数据,请你判断小鱼会不会有危险?如果有危险输出'y',没有危险输出'n'。
//感谢黄小U饮品完善题意
输入输出格式
输入格式:
一行内输入两个实数,用空格分隔,表示s和x。均不大于100
输出格式:
一行内输出'y'或者'n'表示小鱼是否会有危险。
输入输出样例
14 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 0a≤0 or b \le 0b≤0 or c \le 0c≤0 就返回值 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,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)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,ca,b,c 均为15时,调用的次数将非常的多。你要想个办法才行.
/* absi2011 : 比如 w(30,-1,0)w(30,−1,0) 既满足条件1又满足条件2
这种时候我们就按最上面的条件来算
所以答案为1
*/
输入输出格式
输入格式:
会有若干行。
并以 -1,-1,-1−1,−1,−1 结束。
保证输入的数在 [-9223372036854775808,9223372036854775807][−9223372036854775808,9223372036854775807] 之间,并且是整数。
输出格式:
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
输入输出样例
说明
记忆化搜索
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≤100000001≤N≤10000000 )
输出格式:
表中的第 NN 项
输入输出样例
7
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 }
浙公网安备 33010602011771号