博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
95E Lucky Country
阅读量:6326 次
发布时间:2019-06-22

本文共 1111 字,大约阅读时间需要 3 分钟。

题目大意

如果一个数中不包含除4和7之外的数字则是幸运数。有n个岛屿,通过双向道路连接。这些岛屿被分为几个地区。每个岛属于恰好一个区域,同一区域中的任何两个岛之间存在道路,不同区域的任何两个岛之间没有路径。如果一个地区的岛屿数量是一个幸运数字,则这个地区是幸运的。问最少增加几条道路能创建一个幸运地区。

分析

首先直接缩点,这样我们就得到了许多数字,所以任务就变成了用最少数量的不同数字组成幸运数字,首先我们不难想到O(n2)做法:枚举1~n的每一个数字,然后枚举所有现有数字,暴力转移。但显然这样是不行的,所以我们考虑优化转移。我们发现有一些数字重复出现了多次,所以我们可以考虑把它们放在一起记录,即记录大小为x的数字共有s个。然后我们再转移时利用倍增的思想直接将某个数字的个数二进制转换,这样它就可以变成了一个背包问题,可以证明此时的复杂度变为了O(nlogn)。

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define sp cout<<"---------------------------------------------------"<
a;vector
v[100010];int dp[100010];inline void tarjan(int x){ dfn[x]=low[x]=++cnt; a.push(x); ist[x]=1; for(int i=;i
=i*x;j--) dp[j]=min(dp[j],dp[j-i*x]+x); k/=2; } } int ans=inf; for(i=4;i<=n;i++){ int x=i,ok=1; while(x){ if(x%10!=4&&x%10!=7){ok=0;break;} x/=10; } if(!ok)continue; ans=min(ans,dp[i]); } if(ans==inf)puts("-1"); else printf("%d\n",ans-1); return 0;}

转载于:https://www.cnblogs.com/yzxverygood/p/9333773.html

你可能感兴趣的文章
Java 三大特性之继承
查看>>
虚拟机10:使用U盘及U盘启动
查看>>
MySQl的几个配置项
查看>>
linux命令学习——tar
查看>>
UIWebView清除缓存和cookie[转]
查看>>
PHP静态调用非静态方法
查看>>
Spring AOP 实现之CGLIB
查看>>
【原创】erlang 模块之 pg2
查看>>
g++基本用法
查看>>
对称加密算法-DES以及DESede算法
查看>>
JavaBean与Jsp
查看>>
wine 的使用方法
查看>>
【存储】RAID 知识之二
查看>>
DES加密(支持ARC与MRC)
查看>>
git分支原理命令图文解析
查看>>
CentOS安装NVIDIA驱动记
查看>>
PDO连接mysql和pgsql数据库
查看>>
【原创】开源Math.NET基础数学类库使用(01)综合介绍
查看>>
朴素贝叶斯文本分类算法学习
查看>>
python函数式编程
查看>>