week13 面向T1和T2的练习

A - 1-T1

东东正在玩字符串游戏,他有一个魔法,能对字符串进行操作,他能把字符串的第 i i i 个字符串变成 i i i 个。
比如,若字符串为"abc",东东施展魔法把字符串变成了"abbccc"。
但是,改完之后,快递员给东东打电话了,东东拿完快递回来发现自己忘记了原来的字符串,现在只有你能帮东东

Input

第一行输出一个整数 n ( 1 ≤ n ≤ 100 ) n(1 \le n \le 100) n(1n100),表示这个字符串的长度。
第二行输入东东施展魔法后的字符串。

Output

输出东东原来的字符串。

Sample Input 1

6
baabbb

Sample Output 1

bab

Sample Input 2

10
ooopppssss

Sample Output 2

oops

我的思路:
这道题是要讲一个字符串str转化,规则是目标字符串的第一个字符为str[0],第二个为str[1],第三个为str[3]…。我的思路是可以遍历原始字符串,对于当前应该输出的字符,按照规则将索引值加上对应的数字,使得遍历一次原始字符串后,就可以输出最后字符串的结果即设索引值为num,设处置num=0,ind=0,然后在未达到原始字符串尾的时候,每次循环输出str[num],设置num=num+ind,ind++,然后向后一位,便是下一个字符(即num++)

我的总结:
需要弄懂索引的增加规律。

我的代码:

#include<iostream>
#include<cstring>
using namespace std;

int n,ind,num=0;
string st;

int main()
{
	cin>>n;
	cin>>st;
	ind = 0;
	while(num<n)
	{
		cout<<st[num];
		num+=ind;
		ind++;
		num++;
	}
	return 0;
} 

B - 1-T2

在另一个位面,世界末日发生了。东东作为诺亚方舟的船长,他现在从月球开始启动诺亚方舟去其他星球营救民众。东东从若干星球将人运回大本营,星球的数目以及每个星球的坐标和人数都将由输入决定,东东忙着开船,需要你帮忙求出所有人都到达月球并登陆所用的时间。
在直角坐标系的原点是月球,诺亚方舟每次从大本营出发,救了人之后将人送回月球。坐标系中的点代表某个星球。每个屋顶由其位置坐标和其上的人数表示。
诺亚方舟每次从大本营出发,以速度 50 50 50 km/s驶向下一个星球。达到一个星球后,救下其上的所有人,每人上船 1 1 1 s。然后船原路返回,回到月球,每人下船 0.5 0.5 0.5 s。假设原点与任意一个星球的连线不穿过其它星球。

Input

第一行,一个整数,表示兴趣数 n   ( 1 ≤ n ≤ 100 ) n\ (1\le n\le 100) n (1n100)
接下来依次有 n n n 行输入,每一行前两个实数表示星球相对于月球的平面坐标位置 ( x i , y i ) (x_i,y_i) (xi,yi)(单位是km)、然后一个表示人数的整数 r i r_i ri,数之间以一个空格分开。 0 ≤ x i , y i ≤ 100 0\le x_i,y_i \le 100 0xi,yi100 1 ≤ r i ≤ 100 1\le r_i \le 100 1ri100

Output

一行,救援需要的总时间,精确到秒 (向上取整)。

Sample Input

1
30 40 3

Sample Output

7

我的思路:
这道题是要计算每次运送的时间。通过题意可以知道,每一次的时间可以用2*距离/速度+所有人上下的时间(一个人上下共用1.5s),然后将每次的运输时间加和即可。(这里注意时间要精确到秒,向上取整)

我的总结:
不要忘记向上取整。

我的代码:

#include<iostream>
#include<cmath>
using namespace std;

double x,y,num;

int n;

int main()
{
	cin>>n;
	double ans=0.0;
	for(int i=0;i<n;i++)
	{
		cin>>x>>y>>num;
		ans+=sqrt(x*x+y*y)*2.0/50.0+num*1.5;
	}
	cout<<floor(ans)+1; 
	return 0;
} 

C - 2-T1

东东对数字很敏感,他定义了一个数的数根,数根即把一个数的各个位上的数字加起来可以得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于 24 24 24 来说,把 2 2 2 4 4 4 相加得到 6 6 6,由于 6 6 6 是一位数,因此 6 6 6 24 24 24 的数根。再比如 39 39 39,把 3 3 3 9 9 9 加起来得到 12 12 12,由于 12 12 12 不是一位数,因此还得把 1 1 1 2 2 2 加起来,最后得到 3 3 3,这是一个一位数,因此 3 3 3 39 39 39 的数根。

Input

一个正整数(小于 1 0 1000 10^{1000} 101000)。

Output

一个数字,即输入数字的数根。

Sample Input

24

Sample Output

6

我的思路:
这道题是将一个数的每一位相加,如果结果只有一位则输出,否则重复加和所有位,重复上述步骤,知道最后只有一位为止。注意这里的数据范围,10^1000,如果直接用数字的定义,哪怕long long都是不可以的,可以用字符串来装第一次输入的数字,然后根据ASSIC码在每回需要计算的时候转化为整型数。然而从第二次开始就可以正常用整型数进行计算了,因为数据满足int的范围了。

我的总结:
WA了很多次,才发现是数据范围的问题,下次遇到这样的题,一定要先确认好数据范围。

我的代码:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

string st;

int main()
{
	cin>>st;
	int ans=0,cur;
	for(int i=0;i<st.size();i++)
	{
		ans+=int(st[i])-48;
	}
	while(ans>=10)
	{
		cur=0;
		while(ans>=10)
		{
			cur+=ans%10;
			ans/=10;
		}
		cur+=ans;
		ans=cur;
	}
	cout<<ans;
	return 0;
} 

D - 2-T2

东东家里有 N N N 盏灯( N N N 为不大于 5000 5000 5000 的正整数),从 1 1 1 N N N 按顺序依次编号,初始时全部处于开启状态;东东请了一些同学到他家玩,来了 M M M 个人( M M M 为不大于 N N N 的正整数)也从 1 1 1 M M M 依次编号。
第一个人( 1 1 1 号)将灯全部关闭,第二个人( 2 2 2 号)将编号为 2 2 2 的倍数的灯打开,第三个人( 3 3 3 号)将编号为 3 3 3 的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和 3 3 3 号一样,将凡是自己编号倍数的灯做相反处理。
请问:当第 M M M 个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。

Input

输入正整数 N N N M M M,以单个空格隔开, M ≤ N M\le N MN

Output

顺次输出关闭的灯的编号,其间用逗号间隔。

Sample Input

10 10

Sample Output

1,4,9

我的思路:
这道题是要找到经过一些操作后,处于关闭状态的灯的编号。操作对于每个人,第一个人把所有等都关了,第二个把2的倍数灯都打开,然后从第3个人开始,把自己编号的倍数的灯的状态转变(即把关的灯打开,开的灯关掉)。我的思路是,既然人数是固定的,可以遍历每个灯,把所有对这个灯的操作进行一遍,然后判断当前的灯是否为关闭状态即可。

我的总结:
注意是关闭的灯的编号。。。

我的代码:

#include<iostream>
using namespace std;
int n,m;
int main()
{
	cin>>n>>m;
	bool ff=false;
	for(int i=1;i<=n;i++)
	{
		bool flag=false;
		if(i%2==0&& m>=2) flag=true;
		for(int j=3;j<=m;j++)
		{
			if(i%j==0) flag=!flag;
		}
		if(!flag)
		{
			if(ff) cout<<",";
			else ff=true;
			cout<<i;
		}
	}
	return 0;
} 

E - 3-T1

石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。
蒜头君和花椰妹喜欢玩石头剪子布,他们俩玩了 n
局游戏,他们把每局情况记在了纸上,但由于 n 很大很大,所以他们不知道谁赢的次数的更多,现在求助于你,请你编程计算最终谁获胜。

Input

第一行一个整数 n (1≤n≤100)。
接下来 n行,每行两个字母,分别表示蒜头君和花椰妹在这局的情况,其中’S’表示石头,'J’表示剪刀,'B’表示布。

Output

如果蒜头君赢的次数更多,输出"suantou";如果花椰妹赢的次数更多,输出"huaye";如果赢的次数一样多,输出"QAQ"。

Sample Input

3
J S
S S
B J

Sample Output

huaye

我的思路:
这道题是模拟一个石头剪刀布的比赛的过程。这设置两个量来记录这两个人的得分情况,然后就是对于每次胜负的判断,可以将其中一个人胜利的情况和平局的情况列出,剩下的情况就是另一个人胜利了。最后比较各自的分数输出结果即可。

我的总结:
要将人物名字写准。。。

我的代码:

#include<iostream>
using namespace std;
int hua,suan,n;
char ch1,ch2;

int main()
{
	cin>>n;
	hua=0,suan=0;
	while(n--)
	{
		cin>>ch1>>ch2;
		if(ch1==ch2) continue;
		if((ch1=='S'&&ch2=='J')||(ch1=='J'&&ch2=='B')||(ch1=='B'&&ch2=='S')) suan++;
		else hua++;
	}
	if(suan==hua) cout<<"QAQ";
	else if(suan>hua) cout<<"suantou";
	else cout<<"huaye";
	return 0;
} 

F - 3-T2

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小 A和小 B 正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小 A 和小 B 比了 N 轮之后,谁赢的轮数多?

Input

输入包含三行。
第一行包含三个整数:N,NA,NB,分别表示比了 N 轮,小 A 出拳的周期长度,小 B 出拳的周期长度。0<N,NA,NB<100。第二行包含 NA个整数,表示小 A出拳的规律。第三行包含 NB个整数,表示小 B出拳的规律。其中,0表示“石头”,2 表示“剪刀”,5 表示“布”。相邻两个整数之间用单个空格隔开。

Output

输出一行,如果小 A 赢的轮数多,输出"A";如果小 B 赢的轮数多,输出"B";如果两人打平,输出 “draw”。

Sample Input

10 3 4
0 2 5
0 5 0 2

Sample Output

A

Hint

对于测试数据,猜拳过程为:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
A赢了 4 轮,B 赢了 2 轮,双方打平 4 轮,所以 A 赢的轮数多。

我的思路:
这道题也是模拟剪刀石头布,不过这一次每个人有一定的出法周期,即两个人都是按照各自的出法顺序循环出招。对于每次两人的出招,可以用当前回合数对于两个人各自的周期长短取余,就是此局各自的出拳。然后按照上一个实验的对于剪刀石头布的大小判断方法进行判断,最后再输出最后的结果即可。

我的总结:
回合数相对于谁取余,要做好判断。

我的代码:

#include<iostream>
using namespace std;
int n,na,nb,a[100],b[100];
int aa,bb,A=0,B=0;

int main()
{
	cin>>n>>na>>nb;
	for(int i=0;i<na;i++) cin>>a[i];
	for(int i=0;i<nb;i++) cin>>b[i];
	for(int i=0;i<n;i++)
	{
		aa=a[i%na],bb=b[i%nb];
		if(aa==bb) continue;
		if((aa==0&&bb==2) || (aa==2&&bb==5) || (aa==5&&bb==0)) A++;
		else B++;
	}
	if(A==B) cout<<"draw";
	else if(A>B) cout<<"A";
	else cout<<"B";
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值