D 牛牛的呱数 思维题+bfs
时间:2020-05-16
本文章向大家介绍D 牛牛的呱数 思维题+bfs,主要包括D 牛牛的呱数 思维题+bfs使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
链接:https://ac.nowcoder.com/acm/contest/5205/D
题意:给出一堆数字串,给出一个模数p
让我们找出一个这堆数字串的组合方式,满足模p之后等于0
每一个数字串都有无限个,可以用多个,也可以不用;
思路:我们要进行拼接,就要将前面的数字*后面的数字的位数再+上后面的数字,才能算是拼接成功
于是,我们得先初始化出倍数mod p 之后的数组
然后,对于每一个数字串,我们处理出其modp之后剩下的数以及其长度
将每一个串作为第一个串的情况都记录下来,放进优先队列中
然后操作都对队列中所有的数字进行依次拼接
拼接之后,如果原先已经有该模数的长度比较小的,就不需要入队
反正更新权值并且入队
直到操作完毕。。。
但是:我并不知道bfs这个过程的复杂度。。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1000005; 4 const int inf=0x3f3f3f3f; 5 char s[maxn];//存当前大数 6 int dp[204]; 7 int ten[maxn];//记录10的倍数的mod 8 int rmd[104];//记录n个大数的mod 9 int len[103];//记录n个大数的长度 10 struct node{ 11 int mod,len;//队列状态。 12 }; 13 //优先队列比较函数 14 struct cmp{ 15 bool operator()(node a,node b){ 16 //注意,优先队列本来是从大到小,所以这里反着写 17 //即:这里为从小到大排序 18 return a.len>b.len; 19 } 20 }; 21 int main(){ 22 int n,p; 23 scanf("%d%d",&n,&p); 24 //处理10的倍数的mod 25 ten[0]=1; 26 for(int i=1;i<maxn;i++) ten[i]=(ten[i-1]*10)%p; 27 //处理大数的mod和长度 28 for(int i=1;i<=n;i++){ 29 scanf("%s",s+1); 30 len[i]=strlen(s+1); 31 for(int j=1;j<=len[i];j++){ 32 rmd[i]=(rmd[i]*10+(s[j]-'0'))%p; 33 } 34 } 35 //全部更新为inf 36 memset(dp,inf,sizeof(dp)); 37 priority_queue<node,vector<node>,cmp> pq; 38 //初始化已有数值的dp 39 for(int i=1;i<=n;i++) 40 dp[rmd[i]]=min(dp[rmd[i]],len[i]); 41 //把n个初始状态推进去 42 for(int i=0;i<p;i++) 43 if(dp[i]!=inf) 44 pq.push(node{i,dp[i]}); 45 while(!pq.empty()){ 46 node cur=pq.top(); 47 pq.pop(); 48 if(cur.mod==0){ 49 printf("%d\n",cur.len); 50 return 0; 51 } 52 //每种大数都遍历一遍,因为每种都有无限个 53 for(int i=1;i<=n;i++){ 54 node nex; 55 //把新大数加在最右边。 56 nex.mod=(cur.mod*ten[len[i]]%p+rmd[i])%p; 57 nex.len=cur.len+len[i]; 58 if(dp[nex.mod]>nex.len){ 59 dp[nex.mod]=nex.len; 60 pq.push(nex); 61 } 62 } 63 } 64 printf("-1\n"); 65 }
原文地址:https://www.cnblogs.com/pangbi/p/12902257.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法