ZZULIOJ 2477: 文件

24 篇文章 0 订阅

题目描述
作为X星球的战舰指挥官。你明天需要处理的文件非常多。这些文件无序的分成两堆。
堆放在你的办公桌上。现在你想要拿某一个文件。你就必须把上面的文件移动到另一堆的
上面。才能拿到这个文件。移动的规则:你会把这堆最上面的一份文件移动到另一堆的最
上面,重复这个过程。直到拿到你想要的文件。
现在你桌上两堆文件的数量分别为n,m,有q次想拿文件的操作。你想知道每次拿到
自己想要文件需要移动其他文件的最小数量。如果想拿的文件不存在或者之前已经拿过了
就输出-1
(下次拿文件时,文件的摆放是上次拿完文件时的摆放)
输入
多样例测试
一行输入一个整数T表示样例数(1<T<=20)
对于每个样例:
第一行输入n,m,q;(0<n,m<200,0<q<500)
第二行输入n个整数ai表示"A"堆的文件从下到上的编号 (0<ai<10^5)
第三行输入m个整数bi表示"B"堆的文件从下到上的编号(0<bi<10^5)
接下来的q行,每行输入一个整数ci 表示想拿的书的编号(0<ci<10^5)
注意:桌上文件的编号都是唯一的。
输出
对于每一个ci。输出要拿到这个文件需要移动其他文件的最小数量。
样例输入
1
3 3 4
1 2 3
5 7 9
7
7
1
6
样例输出
1
-1
3
-1
提示
样例解释:
'A’堆:(1 2 3) 'B’堆:(5 7 9)
想拿7
移动9:'A’堆:(1 2 3 9) 'B’堆:(5 7)
拿到7(移动一个文件)
'A’堆:(1 2 3 9) 'B’堆:(5)
想拿7
7已经拿过输出-1
'A’堆:(1 2 3 9) 'B’堆:(5)
想拿1
'A’堆:(1 2 3 9) 'B’堆:(5)
移动9:'A’堆:(1 2 3) 'B’堆:(5 9)
移动3:'A’堆:(1 2) 'B’堆:(5 9 3)
移动2:'A’堆:(1) 'B’堆:(5 9 3 2)
拿到1(移动3个文件)
'A’堆:(1 2 3 9) 'B’堆:(5)
想拿6
6不存在输出-1

这题显然要对数组进行删除增加,用vector来做就非常简单了。

#include<vector>
#include<iostream>
using namespace std;
int main(){
	int t, n, m, a, b, q, y, z, x;
	cin >> t;
	while (t--){
		vector<int>::iterator it;
		cin >> n >> m >> q;
		vector<int>a;
		vector<int>b;
		for (int i = 0; i < n; i++)
			cin >> x, a.push_back(x);
		for (int i = 0; i < m; i++)
			cin >> y, b.push_back(y);
		while (q--){
			int flag = 0, count = 0;    //count用来计数
			cin >> z;
			for (it = a.begin(); it != a.end(); it++)         //首先是找出这个数位于A还是B中
				if (*it == z){
					flag = 1;
					break;
				}
			for (it = b.begin(); it != b.end(); it++)
				if (*it == z){
					flag = 2;
					break;
				}
			if (flag == 0)cout << "-1" << endl;
			else if (flag == 1){
				for (it = a.end() - 1; it >= a.begin(); it--)             //例如在A中,就从上往下找,不是要找的就删除,同时把它加到B中,count来记录,找了多少次
				{
					if (*it != z)a.pop_back(), b.push_back(*it), count++;
					else {                   //找到这个数删除。
						a.pop_back();
						break;
					}
				}
			}
			else {
				for (it = b.end() - 1; it >= b.begin(); it--)
					if (*it != z)b.pop_back(), a.push_back(*it), count++;
					else {
						b.pop_back();
						break;
					}
			}
			if (flag != 0)cout << count << endl;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值