atcoder AtCoder Regular Contest 084 D - Small Multiple 最短路
2017-11-05 16:01
513 查看
传送门
思路:建立从1开始达到所有数的边,权值为位数和的差。最后dist[0]就是答案,代表最小的位数和能整除K。
相当于建立一个数x到x+1和x*10分别为1和0的边,最后找到最快到达的k的倍数,即答案。
写法1:spfa
思路二:双端队列
学习一下, 可以重前后插入,然后取队头的数据结构。
首先优先插入x*10,因为权值为0,插在头部。x+1插入尾部。
思路:建立从1开始达到所有数的边,权值为位数和的差。最后dist[0]就是答案,代表最小的位数和能整除K。
相当于建立一个数x到x+1和x*10分别为1和0的边,最后找到最快到达的k的倍数,即答案。
写法1:spfa
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int MAXN = 1000005; struct node { int from, to, w; } G[MAXN]; int dist[MAXN]; int head[MAXN]; bool vis[MAXN]; int cnt; void add(int u, int v, int w) { G[cnt].to=v; G[cnt].w=w; G[cnt].from=head[u]; head[u]=cnt++; } void spfa(int s) { memset(vis, false, sizeof(vis)); queue<int> q; while(!q.empty()) q.pop(); vis[1]=true; q.push(s); dist[s]=0; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=head[u]; ~i; i=G[i].from) { int v=G[i].to; if(dist[v]>dist[u]+G[i].w) { dist[v]=dist[u]+G[i].w; if(!vis[v]) { vis[v]=true; q.push(v); } } } } } int main() { int k; scanf("%d", &k); memset(head, -1, sizeof(head)); memset(dist, 0x3f,sizeof(dist)); cnt=0; for(int i=0; i<k; ++i) { add(i,(i+1)%k, 1); add(i, i*10%k, 0); } spfa(1); printf("%d\n", dist[0]+1); return 0; }
思路二:双端队列
学习一下, 可以重前后插入,然后取队头的数据结构。
首先优先插入x*10,因为权值为0,插在头部。x+1插入尾部。
#include<iostream> #include <cstdio> #include <algorithm> #include <queue> #include <cstring> using namespace std; typedef long long LL; const int MAXN = 100005; const LL inf = 0x3f3f3f3f; int main(void){ int k,v,u; cin>>k; vector<int> dp(k,1000); dp[1] = 0; deque<int> deq; deq.push_front(1); while(v = deq.front()){ deq.pop_front(); u = (v*10)%k; if(dp[u] > dp[v]){ dp[u] = dp[v]; deq.push_front(u); } u = (v+1)%k; if(dp[u] > dp[v]+1){ dp[u] = dp[v]+1; deq.push_back(u); } } cout<<dp[v]+1<<endl; }
相关文章推荐
- Atcoder arc 084 D - Small Multiple(双向队列+抽屉原理)
- Atcoder Regular Contest 084
- AtCoder Regular Contest 061 E - すぬけ君の地下鉄旅行【最短路】
- AtCoder Regular Contest 079-C - Cat Snuke and a Voyage
- AtCoder Regular Contest 080 F - Prime Flip 线性筛+匈牙利算法
- AtCoder Regular Contest 080 CD题
- AtCoder Regular Contest 092-C
- 【图论】【生成树】(AtCoder Regular Contest 093 E) Bichrome Spanning Tree
- AtCoder Regular Contest 080 F - Prime Flip 二分图匹配+哥德巴赫猜想
- AtCoder Regular Contest 101 D - Median of Medians
- AtCoder Regular Contest 071 F - Infinite Sequence 动态规划
- 从AtCoder Regular Contest 077D: 11 中学习逆元的线性求法
- AtCoder Regular Contest 078 D - Fennec VS. Snuke 树型DP/博弈
- AtCoder Regular Contest 078 F - Mole and Abandoned Mine 状压dp
- 【容斥原理】(AtCoder Regular Contest 093 F) Dark Horse
- AtCoder Regular Contest 100 E - Or Plus Max
- AtCoder Regular Contest 076 F - Exhausted (Hall's marriage theorem 或 贪心)
- AtCoder Regular Contest 068 E- Snuke Line
- AtCoder Regular Contest 058 D - Iroha and a Grid 组合数学
- AtCoder Regular Contest 073 F - Many Moves 线段树优化dp