68期竞赛(编程题)

小球游戏:

某台有10个小球的游戏机,其设定的规则如下:每一轮游戏在开始之前会把编号为0到9的小球依次放入从左到右编号也为0到9的10个位置;游戏开始后会快速对调任意两个球的位置若干次,并在结束时要求观众写出从左到右的小球编号顺序,写对就得奖。由于速度很快,所以直接靠观看写对很难。但有个程序员发现这台游戏机其实有一个固定的长度为n的操作序列数据库,每一轮游戏都是随机取一个起始操作序列编号和一个结束操作序列编号(操作序列编号从1到n)并从起始到结束依次执行每个操作序列编号对应的操作,而每个操作序列编号对应的操作就是对该次操作指定的两个编号的位置上的小球进行对调。
现在给出操作序列数据库和每一轮游戏的起始操作序列编号和结束操作序列编号,求每轮游戏结束时从左到右的小球编号顺序。

输入描述:

第一行两个正整数n和m,表示操作序列的长度和游戏轮数。接下来n行,每行两个非负整数a和b,表示每个操作序列指定对调的两个小球所在位置的编号。接下来m行每行两个正整数c和d表示该轮游戏中的起始操作序列编号和结束操作序列编号(c和d都是从1到n之间的正整数且c<d)

输出描述:

m行,代表每轮游戏结束时的小球编号顺序

输入样例:

5 3
0 1
1 2
2 3
0 1
9 0
3 3
1 5
3 4

输出样例:

0 1 3 2 4 5 6 7 8 9
9 1 3 0 4 5 6 7 8 2
1 0 3 2 4 5 6 7 8 9

运行代码:

n, m = map(int, input().split())
q = list()
for _ in range(n):
    a, b = map(int, input().split())
    q.append((a, b))
for _ in range(m):
    balls = list(range(10))
    c, d = map(int, input().split())
    for i in range(c-1, d):
        a, b = q[i]
        balls[a], balls[b] = balls[b], balls[a]

王子闯闸门:(思路比较乱,只通过30%)

波斯王子要去救被贾法尔囚禁的公主,但贾法尔用黑魔法在他面前设置了编号从1到n的n道闸门。从王子的位置到1号闸门需要1秒,从n号闸门到公主所在的位置也需要1秒,从p号闸门到p+1或p-1号闸门都需要1秒。每过1秒钟,王子都必须决定选择前进一道闸门、后退一道闸门或停在原地这三种动作中的一种。当然,王子不能选择移动到关闭状态的闸门而只能选择开启状态的闸门。在王子做出动作选择后,闸门也可能会有关闭和开启的动作,如果王子做完动作后,其所在的闸门在该秒内的动作是从开启变为关闭则他就会被闸门夹死。现在给出闸门数量n和m个闸门的动作时刻表,求波斯王子需要多少秒才能救出公主。

输入描述:

第一行给出n和m,接下来的m行每行代表一个闸门关闭的时段,包含三个数字a、b、c代表编号为a的闸门会在第b秒到第c秒之间关闭,其他时间开启。可能会给出同一编号闸门的多个关闭时段,但这些时段不会相交,即如果给出的数字是a、p、q和a、x、y则不可能p<x<q或x<p<y。

输出描述:

波斯王子救出公主所需要的秒数t(t>0)。

输入样例:

2 2
1 2 3
2 1 2

输出样例:

6

运行代码:

#include<stdio.h>
int main(){
	int n,m,t,now=0;
	scanf("%d%d",&n,&m);
	int a[m][3];
	for(int i=0;i<m;i++)
	scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
	for(t=0;now<n;t++){
	int quit=1,next=1,proit=1;
		for(int d=0;d<m;d++){
			if(a[d][0]==now+1&&t+1<=a[d][2]&&t+1>=a[d][1])
			next=0;
			if(a[d][0]==now&&t+1<=a[d][2]&&t+1>=a[d][1])
			quit=0;
			if(a[d][0]==now-1&&t+1<=a[d][2]&&t+1>=a[d][1])
			proit=0;
		}
		if(next==1)
		now++;
		else if(next==0&&quit==0)
		now--;
		else if(next==0&&quit==0&&proit==0)
		break;
	}
	
	printf("%d",t+1);
	return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值