其他分享
首页 > 其他分享> > 【题解】 [COCI2010-2011#7] GITARA

【题解】 [COCI2010-2011#7] GITARA

作者:互联网

题目传送门:

https://www.luogu.com.cn/problem/P6704

题解 P6704 【[COCI2010-2011#7] GITARA】

题目描述中已经把大意说的很清楚了~

分析

弦数固定只有六根,然后就是考虑每根弦上的操作:对于每一个音调,必须保证在它前面已经被按下的段落中其段数最大。由此,我们可以考虑维护六个栈结构,每个栈代表一根弦。进栈时,如果栈尾的段数比即将进栈的 j 大,栈尾出栈,直到栈尾的段数小于等于将要进栈的段数 j,若小于,新段数进栈,若等于,转向下一个要求 (i,j)。其实就是一个很直接的模拟啦~

分析完成,接下来上代码!

Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,p;
 4 int a[6][500005],q[6];//a数组代表栈,p数组指向对应的每个栈的栈尾 
 5 int ans=0;
 6 int main()
 7 {
 8     scanf("%d%d",&n,&p);
 9     int x,y;
10     for(int i=1;i<=n;i++){
11         scanf("%d%d",&x,&y);
12         x--;//为了节省空间将所有的弦数减一储存 
13         while(a[x][q[x]]>y){//栈尾段数较大的出栈 
14             q[x]--;
15             ans++;
16         }
17         if(a[x][q[x]]<y){//新元素进站(需要动手指呦~) 
18             a[x][++q[x]]=y;
19             ans++;
20         }
21     }
22     printf("%d",ans);
23     return 0;
24  } 

完结撒fa~

标签:栈尾,int,题解,段数,GITARA,进栈,2011
来源: https://www.cnblogs.com/unknown-year/p/13760508.html