【Codeforces 290 B】Fox And Jumping

根据裴蜀定理,当且仅当选出来的集合的L[i]的gcd等于1时,才能表示任何数。

考虑普通的dp,dp[i][j]表示前i个数gcd为j的最少花费,j比较大,但状态数不多,拿个map转移就好了。

技巧&套路:

  • 裴蜀定理,gcd为1表示任何数。
  • 当状态数不多的时候,map暴力转移dp。

 1 #include <cstdio>
 2 #include <map>
 3 #include <algorithm>
 4
 5 const int N = 305;
 6
 7 int n, l[N], c[N];
 8 std::map<int, int> M;
 9
10 int gcd(int a, int b) {
11     if (a < b) std::swap(a, b);
12     return (!b)? (a) : (gcd(b, a % b));
13 }
14
15 int main() {
16     scanf("%d", &n);
17     for (int i = 1; i <= n; ++i) {
18         scanf("%d", &l[i]);
19     }
20     for (int i = 1; i <= n; ++i) {
21         scanf("%d", &c[i]);
22     }
23     for (int i = 1; i <= n; ++i) {
24         for (std::map<int, int>::iterator it = M.begin(); it != M.end(); ++it) {
25             int gc = gcd(it->first, l[i]);
26             if (!M[gc] || M[gc] > it->second + c[i]) {
27                 M[gc] = it->second + c[i];
28             }
29         }
30         if (!M[l[i]] || M[l[i]] > c[i]) {
31             M[l[i]] = c[i];
32         }
33     }
34     if (!M[1]) puts("-1"); else printf("%d\n", M[1]);
35
36     return 0;
37 }

原文地址:https://www.cnblogs.com/Dance-Of-Faith/p/9295876.html

时间: 2024-10-02 10:28:13

【Codeforces 290 B】Fox And Jumping的相关文章

【Codeforces:从头开始】contest 1

[Codeforces:从头开始]contest 1      1A      用 a × a 的石板覆盖 n × m 的长方形广场,允许石板覆盖的区域超出广场,不允许打破石板,石板的两侧应平行于广场两侧,要求覆盖完广场所需的石板数量最少是多少 样例图示: (显然,答案为每边必须铺的+铺出去(1个或0个)) 注意开 long long 代码: #include<bits/stdc++.h> using namespace std; typedef long double ld; typedef

【CodeForces 353 A】Domino

[链接] 我是链接,点我呀:) [题意] [题解] 分类讨论一波 设第一个数组的奇数个数为cnt1 第二个数组的奇数个数为cnt2 显然只有在(cnt1+cnt2)%2==0的情况下. 才可能第一个数组的和为偶数,第二个数组的和也为偶数 (因为奇数都要出现偶数次才可以. 所以只可能cnt1和cnt2都是偶数,那么输出0 否则,cnt1和cnt2都是奇数,看看有没有一个位置i只有a[i]或只有b[i]是奇数.有的话输出1. 其他情况都非法. [代码] #include <bits/stdc++.h

【Codeforces Round 1129】[Alex Lopashev Thanks-Round] (Div. 1)

Codeforces Round 1129 这场模拟比赛做了\(A1\).\(A2\).\(B\).\(C\),\(Div.1\)排名40. \(A\)题是道贪心,可以考虑每一个站点是分开来的,把目的地最小编号的留到最后,所以答案稍微算一下就行了. \(B\)题是道找规律,首先可以很容易地发现只要前面弄个负数的开头,错误算法就会忽略掉这一个值,所以利用这个来构造答案.(最讨厌构造题了)然后推导一番式子就会发现如果我们将第一个值放-1,则 \(\sum_{i=2}^na_i=k+n\), 再更改一

【Codeforces Round 1132】Educational Round 61

Codeforces Round 1132 这场比赛做了\(A\).\(B\).\(C\).\(F\)四题,排名\(89\). \(A\)题\(wa\)了一次,少考虑了一种情况 \(D\)题最后做出来,但被\(hack\)了...被\(hack\)的原因是没有想到答案会超过\(10^{12}\)(毕竟这个时间上的优化也是在最后迫不得已的情况下加的,就没有考虑正确性... Codeforces 1132 C 题意:给一些区间\([l_i,r_i]\),从中删掉两个,求剩下的区间最多能够覆盖的格子数

【Codeforces Round 650】Codeforces #334 (Div. 1)

模拟CF650,ABC三题,RK90 Codeforces 650 A 思路:首先看式子 \(\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}=|x_i-x_j|+|y_i-y_j|\) 的唯一可行的情况是\(x_i=x_j\)或\(y_i=y_j\).(因为两边之和大于第三边 所以就知道怎么做了. 第一种方法:我们维护三个\(map\),分别存行.列.坐标是\(\dots\)的时候已经有多少个节点. 然后就可以边读边算,读到\((x,y)\)这个坐标的时候把\(ans\)变成 \(

【Codeforces 718 A】Efim and Strange Grade

Codeforces 718 A 题意:给一个小数,问最多取\(t\)次四舍五入到某一个小数点后的位后这个数最大能到多少. 思路:首先肯定贪心.(但不知道为什么tag上是\(dp\) 首先我们找到最靠左的一个大于等于5的数,把它四舍五入到上一位, 然后再不断地往前找到下一个大于等于5的数,再四舍五入到上一位... 然后就好了. 原文地址:https://www.cnblogs.com/denverjin/p/10810469.html

【Codeforces 85 D】Sum of Medians

Codeforces 85 D 题意:维护一个有序集合,每次问编号\(mod\ 5\)余\(3\)的所有数的和. 思路:线段树维护\(mod\ 5\)余\(x\)的数的和,然后上推的时候根据左节点的值改一下就好了. Codeforces 718 A 题意:给一个小数,问最多取\(t\)次四舍五入到某一个小数点后的位后这个数最大能到多少. 思路:首先肯定贪心.(但不知道为什么tag上是\(dp\) 首先我们找到最靠左的一个大于等于5的数,把它四舍五入到上一位, 然后再不断地往前找到下一个大于等于5

codeforces 391E2 (【Codeforces Rockethon 2014】E2)

/* 题意:有三棵树,每颗树有ni个结点,添加两条边把这三棵树连接起来,合并成一棵树,使得树中任意两点之间的最短路径 的和最大. 分析: 三棵树要合并成一棵树,则第一棵树必须选择一个点,假设为X,第二棵树必须选择两个点,假设为Y1, Y2,第三棵树必须选择一个点,假设为Z 记第一棵树中所有结点到X的路径总和为:tot1 第二棵树中所有结点到Y1,Y2的路径总和分别为:tot2, tot3 第三棵树中所有结点到Z的路径总和为:tot4; 共有四种情况: 1,每棵树内部的结点之间的距离为常数,可以求

【codeforces #275(div1)】AB题解

A. Diverse Permutation time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Permutation p is an ordered set of integers p1,???p2,???...,???pn, consisting of n distinct positive integers not larg