1 条题解
-
0
读题发现,对于每张马娘卡的贡献与牌堆的顺序有关,即找出在某一张马娘卡前所有支援卡提供战力的最大值。因此,为了维护支援牌堆的最大值,我们可以使用大根堆进行维护,即优先队列。在摸出每一张马娘卡时,加上优先队列的队首即可,若摸出支援卡,则加入优先队列。
const int N=2e5+5; int a[N]; priority_queue<int> pq; void solve(){ while(!pq.empty()) pq.pop(); int n;cin>>n; int ans=0; for(int i=1;i<=n;i++){ int x;cin>>x; if(x==0){ if(!pq.empty()){ ans+=pq.top(); pq.pop(); } else continue; } pq.push(x); } cout<<ans<<endl; }由于本题数据较水,因此可以采用的做法通过,思路大概是当摸到马娘卡时,查找该卡之前的所有支援卡战力值,最后加上最大的值即可,此处给出一份参考代码
const int N = 5005; int s[N]; bool vis[N]; void solve() { memset(vis, 0, sizeof(vis)); int n, ans = 0; cin >> n; for(int i = 1; i <= n; i++) { cin >> s[i]; if(!s[i] && i > 1) { int p = 0, mx = -1; for(int j = i - 1; j >= 1; j--) { if(!vis[j]) { if(mx < s[j]) { mx = s[j]; p = j; } } } vis[p] = 1; ans += mx; } } cout << ans << '\n'; }
- 1
信息
- ID
- 1122
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 33
- 已通过
- 9
- 上传者