1.模拟
先来看下样例数据:
输入:
5
HIGHHOPES
UP
LOWFEELINGS
UP
UPANDDOWN
DOWN
IAMSTILLSTANDING
DOWN
FOOLINGAROUND
DOWN
输出:
UPANDDOWN
IAMSTILLSTANDING
FOOLINGAROUND
HIGHHOPES
LOWFEELINGS
因为前面两首歌的排名上升了
由此可以推测出原来的排名比现在低
同理可得,后面三首歌的排名下降了,
原来的排名应该比现在的排名高
此外,相同的排名应该最先放到上周排序
至此:模拟完成
2.实现:
用的是逆序输出,大体还是一样的
#include<iostream>
using namespace std;
struct{
string sing;//存储歌名
short change=-1;//-1表示未赋值
}n[101];
string before[102];//表示上周排名
int main(){
string a;
int b;
cin>>b;
for(int i=0;i<b;i++){
cin>>n[i].sing;
cin>>a;
if(a=="UP")n[i].change=0;
else if(a=="SAME")n[i].change=1;
else n[i].change=2;
//当输入分别UP,SAME,DOWN时change分别赋值为0,1,2
}
for(int i=0;i<b;i++){
if(n[i].change==1)before[b-1-i]=n[i].sing ;
} //判断SAME
for(int i=0;i<b;i++){
if(n[i].change==2){
for(int M=b-1;M>=0;M--){
if(before[M]==""){
before[M]=n[i].sing;//为空则填入
break;
}
}
}//判断DOWN
}
for(int i=b-1;i>=0;i--){
if(n[i].change==0){
for(int M=0;M<b-1;M++){
if(before[M]==""){
before[M]=n[i].sing;//为空则填入
break;
}
}
}//判断UP
}
for(int i=b-1;i>=0;i--){
cout<<before[i]<<endl;//倒序输出
}
return 0;
} /*
附赠数据一组:
输入:
4
1 UP
2 SAME
3 DOWN
4 DOWN
输出:
3
2
4
1
*/