传送门

题目大意

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

分析

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

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define sp cout<<"---------------------------------------------------"<<endl
const int inf=0x3f3f3f3f;
int dfn[100010],low[100010],ist[100010],s[100010],sum,cnt,tot[100010];
stack<int>a;
vector<int>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<v[x].size();i++)if(!dfn[v[x][i]]){tarjan(v[x][i]);low[x]=min(low[x],low[v[x][i]]);}else if(ist[v[x][i]]){low[x]=min(low[x],dfn[v[x][i]]);}if(dfn[x]==low[x]){sum++;while(1){int u=a.top();a.pop();ist[u]=0;s[sum]++;if(u==x)break;}}
}
int main(){int n,m,i,j,k;scanf("%d%d",&n,&m);memset(dp,0x3f,sizeof(dp));for(i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);v[x].push_back(y);v[y].push_back(x);}for(i=1;i<=n;i++)if(!dfn[i])tarjan(i);for(i=1;i<=sum;i++)tot[s[i]]++;dp[0]=0;for(i=1;i<=n;i++)if(tot[i]){int k=tot[i];while(k){int x=(k+1)/2;for(j=n;j>=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

95E Lucky Country相关推荐

  1. hihocoder 1152 Lucky Substrings

    #1152 : Lucky Substrings 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if and only if t ...

  2. Codeforces 894.D Ralph And His Tour in Binary Country

    D. Ralph And His Tour in Binary Country time limit per test 2.5 seconds memory limit per test 512 me ...

  3. 枚举 + 进制转换 --- hdu 4937 Lucky Number

    Lucky Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) T ...

  4. .Lucky后缀勒索病毒数据解密

    近日,勒索病毒.lucky加密后缀,是新的勒索病毒变种,其传播模块复用了Satan的传播方式,实现了Linux下的自动化传播,我们将其命名为lucky勒索病毒. ***流程: 传播模块: conn与S ...

  5. HDU-5723 Abandoned country

    Problem Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Si ...

  6. Lucky Substrings

    而在26以内且属于fibonacci数列的数为1,2,3,5,8,13,21时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if ...

  7. ZOJ18th省赛 Lucky 7

    [线上网址](http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=378) BaoBao has just found ...

  8. hdu 4937 Lucky Number(数学题 进制转换)2014多校训练第7场

    Lucky Number                                                                          Time Limit: 20 ...

  9. HDU 5676 ztr loves lucky numbers

    -亚信科技,巴卡斯(杭州),壹晨仟阳(杭州),英雄互娱(杭州)  (包括2016级新生)除了校赛,还有什么途径可以申请加入ACM校队?  ztr loves lucky numbers Time Li ...

最新文章

  1. 一文读懂卷积神经网络CNN(学习笔记)
  2. 金碧辉煌!皇城定制5月22日正式对外运营开业!
  3. python 常量_大疆机甲大师Python开发: 两只老虎
  4. JavaSE-21 字符编码简介
  5. python3 collections模块 tree_第30天: Python collections 模块
  6. 本部裁员、分部招人,科技公司的岗位都奔向了外地?
  7. mysql 存储过程 光标_mysql存储过程 光标
  8. 关于mac下连接mysql和mysql workbench连接mysql的异常
  9. 学习Java必看的Java书籍(本本经典实用)
  10. matlab中的semilogy,matlabsemilogy用法
  11. 做好里程碑就是项目成功了一半
  12. opencv 学习(3)几何图形的简单识别
  13. Capstone/CS5211低成本替代昆泰CH7511B方案
  14. 最新微博图片相册批量下载工具
  15. Python解释大数定律
  16. yocto 编译流程分析
  17. 4.16Day21垃圾回收机制、re模块正则
  18. python sklearn svm_文本分类和预测 sklearn.svm.LinearSVC(1)
  19. 心脏滴血漏洞简单攻击
  20. 前端笔记03——重复打开新页签问题

热门文章

  1. 字节跳动、阿里等大厂的真实工作体验如何?5 位程序员的自述
  2. Java 程序员一次有趣的面试 | 每日趣闻
  3. 为什么有些高级开发不喜欢 Python?
  4. 惊艳!为艺术而生的算法
  5. oracle删除临时表空间一直处于等待状态
  6. 海量数据处理相关面试问题
  7. pfsense软路由防火墙(安装过程、L2tp配置)
  8. Flink在美团的实践与应用
  9. 腾讯云宣布核心产品全线降价,最高降幅达50%
  10. AC日记——热浪 codevs 1557 (最短路模板题)