Sicily 1001. 叠罗汉

7 篇文章 0 订阅
3 篇文章 0 订阅

Description


最近叠罗汉成为一种时尚运动,于是有了叠罗汉社……

或许有人比较out,不清楚这种运动的规则,简单来说:就是人叠人,第一个人站在地面,第二个人站在第一个人的肩膀,第三个人站在第二个人的肩膀,依次类推。看过杂技表演的应该明白的。

当然,是人肯定都不希望自己在下面,特别是当女朋友要找的时候,突然发现自己在罗汉塔最底层……

现在ikuy就恰好遇到了这个问题……

Ikuy正在玩叠罗汉游戏,突然电话响了,是GF的,苦于自己正在罗汉塔某个位置,没法接电话,已经知道电话会响 X 单位时间(每次都这样,是约定,如果ikuy不接电话就会被罚一顿饭,连续3次不接就88)。Ikuy很郁闷,想知道自己能不能在规定时间内去接到电话——他必须在规定时间内从罗汉塔中解脱出来。

不过这时他不清楚自己的具体位置,只知道整个游戏已经进行了的过程。

需要你帮忙了……

已经知道过程中每个步骤是这样描述的:

R 表示编号为R的社员爬上去了;

-1 表示最顶上的那个社员下来了;

其中 R 是不大于10000的正整数,保证所有数据合法,即对于第一条命令,保证R此时不在罗汉塔中;

一共有M条命令,经过M条命令后得到现在的罗汉塔;

开始计算时间:

此时,对于第i层的社员,要下来,需要花费的时间是i-1单位时间,ikuy要解放就必须在他上面的所有社员+他本身都从罗汉塔上下来。

哦,忘记了,ikuy的编号是N。

现在希望你能反馈出:ikuy是否能接到电话……

备注:如果需要花费时间和X相等也算接到电话;


Input
输入第一行为T,表示有T组测试数据;

对于每组测试数据格式如下:

第一行为3个整数N,M,X。意义如题目描述;

接下来M行每行有一个整数,表示各个步骤;

规定N不大于10000,M不大于1000,X不大于50000


Output
对于每组测试数据,如果可以接到电话,请输出YES,否则输出NO


每组输出为一行

Sample Input
Copy sample input to clipboard
23 8 51-143-12313 8 31-143-1231
Sample Output
YESNO


#include <iostream>
#include <stack>
using namespace std;
stack<pair<int,int> > lohan;
int main() {
	int t,N,M,X;//N自己的编号,M是经过的命令数,X是电话时长
	cin>>t;

	int x;//从上面下来所用时间
	int top;//获得弹出的顶部编号
	int num;//指令或编号
	for(int i=0; i<t; i++) {//构建罗汉塔
		cin>>N>>M>>X;
		int h=0;
		for(int j=0; j<M; j++) {
			cin>>num;
			if(num==-1) {
				lohan.pop();
				h--;
			}

			else {
				h++;
				lohan.push(pair<int,int>(num,h));
			}


		}
		x=0;

		while(1) {
			if(lohan.top().first!=N) {
				top=lohan.top().second;
				x+=top-1;
				lohan.pop();
			}
			else 
				break;
		}

		x+=lohan.top().second-1;
		if(x<=X)
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
		while(!lohan.empty())
			lohan.pop();
	}
}

另一个朋友写的版本:https://blog.csdn.net/qq_39380075/article/details/77942073

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值