D. The Strongest Build 题解(优先队列维护bfs)
题目链接
思路
其实就是暴力,直接暴力找最大的\(m+1\)个必定有答案
那么求出最大的呢,其实很像bfs,但是是用优先队列直接维护的bfs
代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=4e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n,m;
int a[maxn];
vector<int> vec[10];
map<vector<int>,int> ban,vis;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
for(int j=0,y;j<a[i];j++){
cin>>y;
vec[i].push_back(y);
}
}
cin>>m;
for(int i=1;i<=m;i++){
vector<int> temp;
for(int j=1,y;j<=n;j++){
cin>>y;
temp.push_back(y);
}
ban[temp]=1;
}
priority_queue<pair<int,vector<int> > > pq;
vector<int> temp;
int ma=0;
for(int i=1;i<=n;i++){
temp.push_back(a[i]);
ma+=vec[i].back();
}
pq.push({ma,temp});
vis[temp]=1;
while(!pq.empty()){
vector<int> temp=pq.top().se;
int val=pq.top().fi;
if(!ban.count(temp)){
for(int i=1;i<=n;i++){
cout<<temp[i-1]<<" ";
}
cout<<'\n';
break;
}
pq.pop();
for(int i=1;i<=n;i++){
if(temp[i-1]!=1){
temp[i-1]--;
if(!vis.count(temp)){
vis[temp]=1;
pq.push({val+vec[i][temp[i-1]-1]-vec[i][temp[i-1]],temp});
}
temp[i-1]++;
}
}
}
return 0;
}
不摆烂了,写题