BASIC-24. ⻳龟兔赛跑预测
问题描述
话说这个世界上有各种各样的兔⼦子和乌⻳龟,但是研究发现,所有的兔⼦子和乌⻳龟都有⼀一个共同的特
点——喜欢赛跑。于是世界上各个⻆角落都不不断在发⽣生着乌⻳龟和兔⼦子的⽐比赛,⼩小华对此很感兴趣,于是
决定研究不不同兔⼦子和乌⻳龟的赛跑。他发现,兔⼦子虽然跑⽐比乌⻳龟快,但它们有众所周知的⽑毛病——骄傲
且懒惰,于是在与乌⻳龟的⽐比赛中,⼀一旦任⼀一秒结束后兔⼦子发现⾃自⼰己领先t⽶米或以上,它们就会停下来休
息s秒。对于不不同的兔⼦子,t,s的数值是不不同的,但是所有的乌⻳龟却是⼀一致——它们不不到终点决不不停止。
然⽽而有些⽐比赛相当漫⻓长,全程观看会耗费⼤大量量时间,⽽而⼩小华发现只要在每场⽐比赛开始后记录下兔
⼦子和乌⻳龟的数据——兔⼦子的速度v1(表示每秒兔⼦子能跑v1⽶米),乌⻳龟的速度v2,以及兔⼦子对应的t,s
值,以及赛道的⻓长度l——就能预测出⽐比赛的结果。但是⼩小华很懒,不不想通过⼿手⼯工计算推测出⽐比赛的结
果,于是他找到了了你——清华⼤大学计算机系的⾼高才⽣生——请求帮助,请你写⼀一个程序,对于输⼊入的⼀一
场⽐比赛的数据v1,v2,t,s,l,预测该场⽐比赛的结果。
输⼊入格式
输⼊入只有⼀一⾏行行,包含⽤用空格隔开的五个正整数v1,v2,t,s,l,其中
(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)
输出格式
输出包含两⾏行行,第⼀一⾏行行输出⽐比赛结果——⼀一个⼤大写字⺟母“T”或“R”或“D”,分别表示乌⻳龟获胜,兔⼦子
获胜,或者两者同时到达终点。
第⼆二⾏行行输出⼀一个正整数,表示获胜者(或者双⽅方同时)到达终点所耗费的时间(秒数)。
样例例输⼊入
10 5 5 2 20
样例例输出
D
4
样例例输⼊入
10 5 5 1 20
样例例输出
R
3
样例例输⼊入
10 5 5 3 20
样例例输出
T
4
#include<iostream>
using namespace std;
int main(){
int v1,v2,t,s,l;
cin>>v1>>v2>>t>>s>>l;
int sum,t1;//t1乌龟跑的是时间
int breaktime=0;//判断是否休息
int lent=0,lenr=0;
t1=0;
for(sum=0;lent<l&&lenr<l;sum++)
{
if(breaktime==0)//兔子没有休息
{
if((lent+t)<=lenr)
{
breaktime=(s-1);
}else {
lenr+=v1;
}
}
else//兔子在休息
{
breaktime--;
}
lent+=v2;
cout<<breaktime<<"休息时间"<<endl;
cout<<lent<<"乌龟距离"<<endl;
cout<<lenr<<"兔子距离"<<endl<<endl;
}
if(lent >= l && lenr < l) {
cout << "T" << endl;
} else if(lent < l && lenr >= l) {
cout << "R" << endl;
} else {
cout << "D" << endl;
}
cout << sum;
return 0;
}
思考点:
1、这里设计休息的秒速应该设计为s-1秒,因为在他breaktime的当秒中兔子已经在休息了
大佬的做法:
#include<iostream>
using namespace std;
int main(){
int vr,vt,t,s,l;
cin>>vr>>vt>>t>>s>>l;
int ttime =l/vt;
int cnttime=0;
int lent=0;
int lenr=0;
int breaktime=0;
int flag=0;
while(lenr<l&&lent<l)
{
if(flag==0&&lenr-lent<t||flag==1&&breaktime>=s)
{
lenr+=vr;
flag=0;
breaktime=0;
}else{
flag=1;
breaktime++;
}
lent=lent+vt;
cnttime++;
}
if(lent>=l&&lenr<l){
cout << "T" << endl;
}else if(lent < l && lenr >= l) {
cout << "R" << endl;
} else {
cout << "D" << endl;
}
cout << cnttime;
return 0;
}
大佬的点就是在判断那里多了flag==1&&breaktime>=s
BASIC-25. 回形取数
问题描述
回形取数就是沿矩阵的边取数,若当前⽅方向上⽆无数可取或已经取过,则左转90度。⼀一开始位于矩
阵左上⻆角,⽅方向向下。
输⼊入格式
输⼊入第⼀一⾏行行是两个不不超过200的正整数m, n,表示矩阵的⾏行行和列列。接下来m⾏行行每⾏行行n个整数,表示
这个矩阵。
输出格式
输出只有⼀一⾏行行,共mn个数,为输⼊入矩阵回形取数得到的结果。数之间⽤用⼀一个空格分隔,⾏行行末不不要
有多余的空格。
样例例输⼊入
3 3
1 2 3
4 5 6
7 8 9
样例例输出
1 4 7 8 9 6 3 2 5
样例例输⼊入
3 2
1 2
3 4
5 6
样例例输出
1 3 5 6 4 2
#include<iostream>
#include<memory.h>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
int b[201][201];
memset(b,-1,sizeof(b));
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
cin>>b[i][j];
}
int total=0;
int flag=0;
// cout<<endl;
// for(int i=0;i<m;i++)
// {
// for(int j=0;j<n;j++)
// cout<<b[i][j]<<" ";
// cout<<endl;
// }
int i=0,j=0;
while(total<m*n)
{
//down
while(i<=m-1&&b[i][j]!=-1&&flag==0)
{
cout<<b[i][j];
b[i][j]=-1;
total++;
i++;
flag=1;
}
while(i<=m-1&&b[i][j]!=-1&&flag==1)
{
cout<<" "<<b[i][j];
b[i][j]=-1;
total++;
i++;
}
i--;
j++;
//right
while(j<=n-1&&b[i][j]!=-1)
{
cout<<" "<<b[i][j];
b[i][j]=-1;
total++;
j++;
}
j--;
i--;
//up
while(i>=0&&b[i][j]!=-1)
{
cout<<" "<<b[i][j];
b[i][j]=-1;
total++;
i--;
}
i++;
j--;
//left
while(j>=0&&b[i][j]!=-1)
{
cout<<" "<<b[i][j];
b[i][j]=-1;
total++;
j--;
}
i++;
j++;
}
return 0;
}
思考点:
1、怎么行末不要有空格
2、如果没有初始化这样,用while会比较好
BASIC-26. 报时助手
问题描述
给定当前的时间,请⽤用英⽂文的读法将它读出来。
时间⽤用时h和分m表示,在英⽂文的读法中,读⼀一个时间的⽅方法是:
如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“three o’clock”。
如果m不不为0,则将时读出来,然后将分读出来,如5:30读作“five thirty”。
时和分的读法使⽤用的是英⽂文数字的读法,其中0~20读作:
0:zero, 1: one, 2:two, 3:three, 4:four, 5:five, 6:six, 7:seven, 8:eight, 9:nine, 10:ten, 11:eleven,
12:twelve, 13:thirteen, 14:fourteen, 15:fifteen, 16:sixteen, 17:seventeen, 18:eighteen,
19:nineteen, 20:twenty。
30读作thirty,40读作forty,50读作fifty。
对于⼤大于20⼩小于60的数字,⾸首先读整⼗十的数,然后再加上个位数。如31⾸首先读30再加1的读法,
读作“thirty one”。
按上⾯面的规则21:54读作“twenty one fifty four”,9:07读作“nine seven”,0:15读作“zero
fifteen”。
输⼊入格式
输⼊入包含两个⾮非负整数h和m,表示时间的时和分。⾮非零的数字前没有前导0。h⼩小于24,m⼩小于
60。
输出格式
输出时间时刻的英⽂文。
样例例输⼊入
0 15
样例例输出
zero fifteen
#include<iostream>
using namespace std;
string s[21]={"zero","one","two","three","four","five","six","seven",
"eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen",
"seventeen","eighteen","nineteen","twenty"};
string b[3]={"thirty","forty","fifty"};
int main(){
int h,m;
cin>>h>>m;
if(h>=24||m>=60)
{
cout<<"输入不合规格";
return 0;
}
if(m==0&&h!=0)
cout<<s[h]<<" o’clock";
else{
if(h<=20)
cout<<s[h]<<" ";
else
{
cout<<s[20]<<" "<<s[h-20]<<" ";
}
if(m<=20)
cout<<s[m];
else if(m<30&&m>20)
cout<<s[20]<<" "<<s[m-20];
else if(m<40&&m>30)
cout<<b[0]<<" "<<s[m-30];
else if(m<50&&m>40)
cout<<b[1]<<" "<<s[m-40];
else if(m<60&&m>50)
cout<<b[2]<<" "<<s[m-50];
else if(m==30)
cout<<b[0];
else if(m==40)
cout<<b[1];
else if(m==50)
cout<<b[2];
}
return 0;
}
大佬的方法:
#include <iostream>
using namespace std;
int main() {
int h, m;
cin >> h >> m;
string arr[24] = {"zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen",
"fourteen", "fifteen", "sixteen", "seventeen",
"eighteen", "nineteen", "twenty", "twenty one", "twenty two", "twenty
three"};
cout << arr[h] << " ";
if (m == 0)
cout << "o'clock";
int t = m % 10;
m = m / 10;
switch(m) {
case 2: cout << "twenty "; break;
case 3: cout << "thirty "; break;
case 4: cout << "forty "; break;
case 5: cout << "fifty "; break;
default: break;
}
if (m == 0 && t != 0) {
cout << arr[t];
}
if (m == 1) {
cout << arr[t + 10];
}
if (m != 0 && m != 1 && t!= 0) {
cout << arr[t];
}
return 0;
}
思考点:
1、大佬的方法简单很多,领用switch快速分类