[无聊测试赛] T6 排行榜

简单的排序题.遍历第一遍时将UP放入queue,same直接放,Down建指针放在第一个可以使用的位置.第二遍将UP放入就可

这里我使用的struct记录每个点的位置和状态

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
struct Edge{
  string type;
  int num;
}edge[105];
string last[105];
queue<string> q;
int n;
int main(){
  cin >> n;
  for (int i=0;i<n;i++) last[i] = "?";//开始不知道
  //1表示UP,-1表示DOWN,'S'表示SAME
  for (int i=0;i<n;i++){
    string a,b; cin >> a >> b;
    if (b[0]=='U') edge[i] = (Edge){a,1};
    else if (b[0]=='D') edge[i] = (Edge){a,-1};
    else if (b[0]=='S') edge[i] = (Edge){a,0};
  }
  int ptr = 0;//指针指第一个没有使用的位置
  for (int i=0;i<n;i++){
    if (edge[i].num==0) last[i] = edge[i].type;//如果是SAME直接放
    else if (edge[i].num==1)q.push(edge[i].type);//UP放进队列
    else{//DOWN用指针放
      while(last[ptr]!="?") ptr++;
      last[ptr] = edge[i].type;
      ptr++;
    }
  }
  for (int i=0;i<n;i++){
    if (last[i]=="?") last[i] = q.front(),q.pop();
  }//第二遍放UP
  for (int i=0;i<n;i++) cout << last[i] << endl;//输出答案就行了
}

猜你喜欢

转载自www.cnblogs.com/DannyXu/p/12536353.html