forth

CodeForces - 796B  div-2

题意:

桌子上有n个杯子(编号1~n),m个洞,移动k次杯子(这里是直接交换两个杯子的位置,因此不需要考虑杯子之间的杯子),刚开始骨头在一号杯子里面,求经过k次移动后,骨头的最终位置

思路:

开一个状态数组,把有洞的位置状态定义为true,每次输入两个要交换的杯子,看两个位置的状态

1.当装有骨头的杯子移动到一个洞的上方时,骨头掉下来了,因此,之后的移动都不起作用,此时是答案

2.注意当1的位置有洞,即一开始就掉下去的情况

 

最后一个循环直接搞定!

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int h;
 8 bool st[1000020];
 9 int x1,x2;
10 int main()
11 {
12     int n ,m ,k;
13     int res = 1;
14     cin >> n >> m >> k;
15     for(int i = 1 ;i <= m ; i ++ ) cin >> h , st[h] = true;
16     
17     for(int i = 1 ; i <= k ; i ++ )//一个循环浓缩了很多!!
18     {
19         cin >> x1 >> x2;
20         if(x1 == res && st[x1] == false)//如果骨头在第一个杯子里,并且第一个杯子没洞,那么骨头会交换到第二个杯子的位置,而x1不等于res时,res不变,x1有洞时,res也不变。
21             res = x2;
22         else if(x2 == res && st[x2] == false)//第二个杯子同理,而举个例子,如果第二个杯子有洞,那res还是等于x2
23             res = x1;
24     }                                       
25     cout << res << endl;
26     return 0;
27 } 

 

posted @ 2021-02-04 18:19  彦辰kkkkk  阅读(269)  评论(0)    收藏  举报