1106: [POI2007]立方体大作战tet

Description

  一个叫做立方体大作战的游戏风靡整个Byteotia。这个游戏的规则是相当复杂的,所以我们只介绍他的简单规
则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置。这些元素拥有n个不同的编号,每个编号正好有两个
元素。玩家每次可以交换两个相邻的元素。如果在交换之后,两个相邻的元素编号相同,则将他们都从栈中移除,
所有在他们上面的元素都会掉落下来并且可以导致连锁反应。玩家的目标是用最少的步数将方块全部消除。

Input

  第一行包含一个正整数n(1<=n<=50000)。接下来2n行每行一个数ai,从上到下描述整个栈,保证每个数出现且
仅只出现两次(1<=ai<=n)。初始时,没有两个相同元素相邻。并且保证所有数据都能在1000000步以内出解。

Output

  第一行包含一个数m,表示最少的步数。

Sample Input

样例输入1
5
5
2
3
1
4
1
4
3
5
2
样例输入2
3
1
2
3
1
2
3

Sample Output

样例输出1
2
样例输出2
3

HINT

 

 

 
贪心一下。。。似乎从下面消比较好。。。然后就过了。。。
似乎是因为如果这样消,就是从内往外消,然后这样显然是最优的。。。
 1 #include
 2 #include
 3 #include
 4 #include
 5 #include
 6 #include
 7 #include<string>
 8 #include
 9 #include
10 #include
11 #include<set>
12 #define inf 1000000000
13 #define maxn 100000+5
14 #define maxm 10000+5
15 #define eps 1e-10
16 #define ll long long
17 #define for0(i,n) for(int i=0;i<=(n);i++)
18 #define for1(i,n) for(int i=1;i<=(n);i++)
19 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
20 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
22 using namespace std;
23 int t[maxn],s[maxn],top,ans;
24 int read(){
25     int x=0,f=1;char ch=getchar();
26     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
27     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
28     return x*f;
29 }
30 int main(){
31     //freopen("input.txt","r",stdin);
32     //freopen("output.txt","w",stdout);
33     int n=read();
34     for1(i,2*n){
35         int x=read();
36         if(t[x]){
37             int j;
38             for(j=top;j;j--)
39                 if(s[j]==x)break;
40             ans+=top-j;
41             while(j<top){
42                 s[j]=s[j+1];
43                 j++;
44             }
45             top--;
46         }
47         else{
48             t[x]=1;
49             s[++top]=x;
50         }
51     }
52     printf("%d",ans);
53     return 0;
54 }
View Code

 

转载于:https://www.cnblogs.com/htwx/articles/5541108.html

你可能感兴趣的:(1106: [POI2007]立方体大作战tet)