舞蹈课
Posted adelalove
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了舞蹈课相关的知识,希望对你有一定的参考价值。
有n个人参加一个舞蹈课。每个人的舞蹈技术由整数来决定。在舞蹈课的开始,他们从左到右站成一排。当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。如果不止一对,那么最左边的那一对出列。一对异性出列之后,队伍中的空白按原顺序补上(即:若队伍为ABCD,那么BC出列之后队伍变为AD)。舞蹈技术相差最小即是ai的绝对值最小。 任务是模拟以上过程,确定跳舞的配对及顺序。 输入输出格式 输入格式: 第一行为正整数n(1<=n<=2*10^5):队伍中的人数。下一行包含n个字符B或者G,B代表男,G代表女。下一行为n个整数ai(ai<=10^7)。所有信息按照从左到右的顺序给出。在50%的数据中,n<=200。 输出格式: 第一行:出列的总对数k。接下来输出k行,每行是两个整数。按跳舞顺序输出,两个整数代表这一对舞伴的编号(按输入顺序从左往右1至n编号)。请先输出较小的整数,再输出较大的整数。 输入输出样例 输入样例#1: 4 BGBG 4 2 4 3 输出样例#1: 2 3 4 1 2
如果不止一对,那么最左边的那一对出列。
没有什么想要说的,但是要强调一点:一定要认真读题
因为忽略(没有认真读题)上面红色的一句话,而导致只有90分;真扎心
文化课也是如此,一定要好好读题,
尤其是物理
一步错,步步错
到最后不要满盘皆输啊。
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define DB double 4 using namespace std; 5 const int N=3e5*3+10; 6 int n,a[N],L[N],R[N]; 7 int lf,rf; 8 char s[N]; 9 struct node{ 10 int l,r,o; 11 bool operator <(const node &x) const{ 12 if(o!=x.o)return o>x.o; 13 else if(l!=x.l) return l>x.l; 14 else return r>x.r; 15 } 16 }ff; 17 priority_queue<node>q; 18 int ansl[N],ansr[N],ans; 19 bool v[N]; 20 int main() 21 { 22 scanf("%d",&n); 23 scanf("%s",s+1); 24 for(int i=1;i<=n;++i) 25 scanf("%d",&a[i]),L[i]=i-1,R[i]=i+1; 26 for(int i=2,o;i<=n;++i) 27 { 28 o=abs(a[i]-a[i-1]); 29 if(s[i]!=s[i-1]) 30 q.push((node){i-1,i,o}); 31 } 32 while(!q.empty()) 33 { 34 ff=q.top();q.pop(); 35 if(v[ff.l] || v[ff.r]) continue; 36 ans++;ansl[ans]=ff.l;ansr[ans]=ff.r; 37 v[ff.l]=v[ff.r]=1; 38 lf=L[ff.l];rf=R[ff.r]; 39 R[lf]=rf;L[rf]=lf; 40 if(lf>=1 && rf<=n && s[lf]!=s[rf]) 41 if(!v[lf] && !v[rf]) 42 q.push((node){lf,rf,abs(a[lf]-a[rf])}); 43 } 44 printf("%d ",ans); 45 for(int i=1;i<=ans;++i) 46 printf("%d %d ",ansl[i],ansr[i]); 47 return 0; 48 }
以上是关于舞蹈课的主要内容,如果未能解决你的问题,请参考以下文章