http://acm.zjut.edu.cn:8181/web/problem.php?id=1156
1156: 线性连连看
Description
连连看是一款老少皆宜,大众喜闻乐见的游戏,只要将相同的两张牌用三根以内的直线连在一起就可以消除,规则简单,容易上手。
普通的连连看都是在二维平面上的,而这次的任务没有这么复杂,所有的牌都排成一牌,就像一条直线,因此,这个简化了的游戏也被称为“线性连连看”。
现在我们假设有N
张牌,每张牌A
i (1
≤ i
≤ N)
上的图案用正整数编号表示。用户每次会选中一张牌,而你要做的,就是找出在这张牌右边的,图案与这张牌相同的牌,并输出其所在位置的下标。如果有多张符合条件的牌,那么选择最左边的那张牌;如果没有符合条件的牌,输出 -1
。注意每次消掉两张牌后,所有的牌会向左靠拢,填补剩下牌的空缺。
Input
第一行一个整数 T
,表示有 T
组数据。
每组数据第一行一个整数 N (1
≤ N
≤ 1000)
,表示初始时牌的数量。接下来一行 N
个整数 A
i (1
≤ A
i
≤ 10
9)
每个整数表示牌上的图案编号。再接下来一行是一个整数Q (1
≤ Q
≤ 1000)
,表示用户有 Q
个操作。接下来Q
行每行一个整数 Q
i
表示用户选择了第 Q
i
张牌,注意 Q
i
可能超过现有牌的长度,此时应该输出 -1
。
Output
对于每个询问,输出答案,每个询问占一行。每组数据后输出一个空行。
Sample Input
2
8
1 1 2 2 3 3 4 4
4
1
1
1
1
8
9 3 3 4 3 6 5 4
5
1
2
3
4
5
Sample Output
2
2
2
2
-1
3
-1
-1
-1
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a;
list<int> l;
for(int i=0;i<n;i++)
{
cin>>a;
l.push_back(a);
}
int q;
cin>>q;
for(int j=0;j<q;j++)
{
int qi;
cin>>qi;
if(qi>l.size()) cout<<-1<<endl;
else
{
list<int>::iterator it=l.begin(),itf,itt;
for(int k=1;k<qi;k++)
it++;
itt=it;
itt++;
int w=qi+1;
for(itf=itt;itf!=l.end();itf++,w++)
{
if(*it==*itf) break;
}
if(itf!=l.end())
{
cout<<w<<endl;
l.erase(it);
l.erase(itf);
}
else cout<<-1<<endl;
}
}
cout<<endl;
}
return 0;
}