1574D The Strongest Build (Educational Codeforces Round 114 (Rated for Div. 2))
题意
给定n个从小到大的数组,从每个数组中选出一个下标构成一个序列,但是有m种序列被ban了,要求选出的序列对应的数字和最大且没有被ban。
思路
因为有m个序列被ban了,那么最坏的情况可以假设为最大的m个序列被ban了,那么要求的序列就是第m+1大的序列,优先队列+bfs求前m+1大的序列就好了,在求的中途碰到没有被ban的序列直接退出输出即可。查询一个序列是否被ban用hash的思想,用map+vector的方式查询一个序列是否被ban。还是不好懂的看代码比较清晰=3=.
代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[13][200005];
int c[13];
typedef pair<int,vector<int> > prefix;//first存储该序列的和,vector存储序列
struct cmp//优先队列用
{bool operator()(const prefix p1,const prefix p2){return p1.first<p2.first;}
};priority_queue<prefix,vector<prefix>,cmp >q;//大根堆优先队列存储序列map<vector<int>,bool>mp;//查询一个序列是否被ban,mp[v]=1,则v这个序列被ban了
pair<int,vector<int> >ans;//存储答案,int为答案的和大小,vector存储答案序列
map<vector<int>,bool>mp2;//bfs中途判断这个序列有没有走过,比如222 可以由322,232,223走到,相当于一般bfs的vis数组
void bfs()//bfs+优先队列求没被ban的最大的序列
{while(q.size()){ans=q.top();//先给ans赋值当前优先队列中最大的序列q.pop();mp2[ans.second]=1;//这个序列被走过if(!mp[ans.second])//如果这个序列没被ban则退出break;for(int i=1;i<=n;i++)//bfs每个走一步能变成的序列{int sum=ans.first;//存储当前序列和vector<int>v=ans.second;//存储当前序列if(v[i-1]>1)//如果当前序列第i个大于1说明还可以-1,那么对他进行-1加入队列操作{sum-=(a[i][v[i-1]]-a[i][v[i-1]-1]);//更新和v[i-1]--;//第i个-1pair<int,vector<int> >tmp;tmp.first=sum;tmp.second=v;if(!mp2[tmp.second])//判断这个序列有没有走过{q.push(tmp);mp2[tmp.second]=1;}}}}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)//输入n个数组{scanf("%d",&c[i]);for(int j=1;j<=c[i];j++){scanf("%d",&a[i][j]);}}int m;scanf("%d",&m);for(int i=1;i<=m;i++)//输入m个被ban的序列{vector<int>v;for(int j=1;j<=n;j++){int t;scanf("%d",&t);v.push_back(t);}mp[v]=1;}//给ans赋值当前最大的序列并加入优先队列ans.first=0;vector<int>v1;for(int i=1;i<=n;i++){v1.push_back(c[i]);ans.first+=a[i][c[i]];}ans.second=v1;q.push(ans);bfs();//bfs求最大的没被ban的序列vector<int>v2;v2=ans.second;for(int i=0;i<n;i++)//输出答案{printf("%d ",v2[i]);}printf("\n");return 0;
}
1574D The Strongest Build (Educational Codeforces Round 114 (Rated for Div. 2))相关推荐
- Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs
传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 114 (Rated for Div. 2) 个人题解
中秋节快乐! A. Regular Bracket Sequences 题意 输出nnn个不同的长度为2n2n2n的合法括号序列. 分析 先输出一个"()()()-"序列. 然后依 ...
- Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))...
题目链接: https://codeforces.com/contest/1093/problem/G 题目: 题意: 在k维空间中有n个点,每次给你两种操作,一种是将某一个点的坐标改为另一个坐标,一 ...
- Educational Codeforces Round 114 (Rated for Div. 2)C. Slay the Dragon
题目链接:Problem - 1574C - Codeforces Recently, Petya learned about a new game "Slay the Dragon&quo ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- Educational Codeforces Round 88 (Rated for Div. 2) E(数学)
Educational Codeforces Round 88 (Rated for Div. 2)E 题目大意: 给你n,k(1<=k<=n<=5e5),从1到n中选k个数组成一个 ...
- Educational Codeforces Round 61 (Rated for Div. 2)(A、B、C、D、E、F)
欢迎访问本菜鸡的独立博客:Codecho 比赛名称 Educational Codeforces Round 61 (Rated for Div. 2) 比赛链接 https://codeforces ...
- Educational Codeforces Round 123 (Rated for Div. 2)(ABCDE)
Educational Codeforces Round 123 (Rated for Div. 2)(ABCDE) A. Doors and Keys 题意:给定长度为6的字符串,问是否可以通关,其 ...
最新文章
- 快速排序算法(基于Java实现)
- 从不同视角筛选数据:可视化之前最关键的工作
- python学习札记20210123
- BZOJ2091 [Poi2010]The Minima Game
- celery java_Celery详解
- 天翼云从业认证(4.12) 天翼云医疗行业解决方案
- hadoop中job.setOutputFormatClass(PartitionByCoun...
- [C++] - Returning by const value
- Java基础面试题,啾啾啾~~~
- Node.js 入门知识点总结
- java开发微信公众号支付全流程
- 固态硬盘进阶知识:颗粒篇
- Linux系统CentOS7破解密码
- linux里数据库退格,Oracle Database for Linux 不能使用退格键
- iOS开发-苹果开发者账号注册、申请续费整个流程
- 怎么看自己的操作系统?
- Xavier法与何恺明法初始化权重的意义及原理
- 【数据分析】基于时间序列的预测方法(2021-01-08)时间序列预测
- 用Python进行多元线性回归分析(附代码)
- 【基本功】深入剖析Swift性能优化