Bus of Characters
CodeForces - 982B题意:公交车上有n排座位编号为1-n,每排有两个座位,奇怪的是,这些座位的宽度是完全不一样的,现在有2×n个人有顺序的上车,其中有n个内向的人,n个外向的人。每个内向的人只能和外向的人坐在一起。内向的人上车后,会选择没有人的,且座位宽度小的座位坐下,而外向的人会选择有人的,座位宽度大的座位坐下,现给出一个长为2×n的01串,0表示内向的人,1表示外向的人,输出每个人坐位的排号。
思路:水题,把宽度按从小到大排序,如果是内向的人的话,直接坐最小的座位,并把这个位置入栈,如果是外向的,就直接出栈即可。
因为后入栈的一定比先入栈的座位宽度要大,所以这样做是可行的!
#include "iostream" #include "algorithm" #include "cstdio" #include "stack" using namespace std; typedef pair<int,int> P; P man[200005]; bool cmp(P a,P b) { return a.first<b.first; } int main() { int n,t=1; char x; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&man[i].first); man[i].second=i; } getchar(); sort(man+1,man+1+n,cmp); stack<P> s; if(!s.empty()) s.pop(); for(int i=1;i<=2*n;i++){ scanf("%c",&x); if(x=='0'){ printf("%d",man[t].second); s.push(man[t]); t++; } else{ P m=s.top(); s.pop(); printf("%d",m.second); } if(i!=2*n) printf(" "); else printf("\n"); } return 0; }