20pts贪心过不去,怀疑算法有问题,求助
  • 板块P1159 排行榜
  • 楼主Kmystery
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/20 09:44
  • 上次更新2024/7/20 10:39:22
查看原帖
20pts贪心过不去,怀疑算法有问题,求助
617257
Kmystery楼主2024/7/20 09:44

神犇救救,查了好一阵子不知道哪里有问题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;
}
2024/7/20 09:44
加载中...