标题描述
肖宇射击很快,“在358团,大家都知道我射击很快。”他常说。
他要跟你玩一个经典的游戏:用几个杯子盖住一个球并随机交换它们的位置,然后让你猜猜球在哪个杯子里。当然,因为小宇速度很快,所以他不会用3个杯子三个杯子猜小球,而是n个杯子,而且球不止一个,他会进行m次交换。而且因为他的速度很快,所以他可以在一瞬间移动k个杯子。你拼尽全力跟上他的猜测,但很遗憾,你没能猜出球的位置。不过没关系,你决定从错误中汲取教训,总结经验,下次再赢。
现在你知道了所有球在交换后的位置,也向小宇询问了所有交换后的情况。现在你想推断球的初始位置。
进入
之一行两个数字n和m,含义与题目描述相同,n和m均不大于2000。
然后有m组数据,每组数据之一行是一个数字k,意思和题目描述的一样,k不大于100。接下来的k行每行包含两个数字a和b,中间用空格隔开,表示将杯子a移动到杯子b的位置。
例如:
1 2
23
3 1
4 5
5 4
经过这次移动后,杯子从一开始的 1 2 3 4 5 移动到了 3 1 2 5 4。
保证对于任意数字x,它要么不出现在这k行数据中,要么在左边出现一次,在右边出现一次。
后面是数字q,表示有q个球。
接下来是 q 行,每行一个数字 p 表示该单词被移动后的第 p 个杯子里有一个球。例如上例中 p 为 3,对应 3 1 2 5 4 中的 2,表示一开始 2 号杯子里有一个球。q 不大于 n,且每个 p 都不大于 n 且不相等。
输出
为每个输入p输出一个数字,每个数字占一行,表示每个输入p的起始位置。
示例输入
3 3
2
1 2
2 1
2
2 3
3 2
2
3 1
1 3
1
2
示例输出
3
交流代码
#include
#include
using namespace std;
const int N = 2002;
const int K = 101;
queue q[N];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
q[i].push(i);
}
while(m--){
int k;
cin>>k;
while(k--){
int c,d;
cin>>c>>d;
q[d].push(q[c].front());
q[c].pop();
}
}
int l;
cin>>l;
int f;
while(l--){
cin>>f;
cout<
注意
最精妙的部分是队列数组的创建和使用。
使用队列可以完美模拟该问题所需的交易数量。
让每个位置变成一个队列,以方便如标题所示的输入表单。
未经允许不得转载! 作者:admin,转载或复制请以超链接形式并注明出处天心神途传奇手游发布网。
原文地址:《三个杯子猜小球 小雨快(解)》发布于:2024-06-24
还没有评论,来说两句吧...