神犇救救,查了好一阵子不知道哪里有问题qwq 算法:
例如有5首歌(U:UP,S:SAME,D:DOWN)
A B C D E
U S D D D
列出上周每个位置可能出现的歌:
1 C D E
2 B
3 A D E
4 A E
5 A
然后统计每首歌可能出现的位置数量(上表中出现的次数)
接下来从第一个位置开始,每次选定在此位置可能出现的歌中位置数量最小的歌并输出,然后划掉选定的歌(整张排行榜将不再考虑此歌)并将此行所有可能出现的歌[可能出现的位置数量]-1。
第一次操作后如图:
1 输出了C
2 B
3 A D E
4 A E
5 A
后面更新每个数据[可能出现的位置数量]并重复此操作n次。
不明白我的思路有什么问题,手捏的几组数据和样例都能过,交上去只有1和2能过。代码如下:
#include <bits/stdc++.h>
using namespace std;
struct song{
string name;//歌名
int upp;//上周的上升情况 -1下降 0不变 1上升
}s[200];
int n,lb[200],bs[200];//lb:上周榜单 bs:每首歌所剩余的位置
bool b[200][200];
int main(){
string up_;
cin >> n;
for (int i=1;i<=n;i++){
cin >> s[i].name >> up_;
if(up_=="UP") s[i].upp=1;
if(up_=="SAME") s[i].upp=0;
if(up_=="DOWN") s[i].upp=-1;
}//输入
for (int i=1;i<=n;i++){
if(s[i].upp==1){
for (int j=i+1;j<=n;j++) {
if(s[j].upp!=0){
b[j][i]=true;
bs[i]++;
}
}
}
if(s[i].upp==0){
b[i][i]=true;
bs[i]++;
}
if(s[i].upp==-1){
for (int j=i-1;j>=1;j--) {
if(s[j].upp!=0){
b[j][i]=true;
bs[i]++;
}
}
}
}//处理数据
//for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){cout << b[i][j] << " ";}cout << endl;}
int mini,minl;
for (int i=1;i<=n;i++){
mini=0,minl=114514;
for (int j=1;j<=n;j++){
if(b[i][j]){
if(bs[j]<minl&&bs[j]!=-1){
mini=j;
minl=bs[j];
}
b[i][j]=false;
bs[j]--;
}
}
cout << s[mini].name << endl;
bs[mini]=-1;
}//开贪
return 0;
}