Fox And Jumping

Fox And Jumping

题目链接:http://codeforces.com/problemset/problem/512/B

dp

若所选卡片能到达区间内任意点,那么所选卡片的最大公约数为1(a*x+b*y=gcd(a,b)=1)。

定义状态dp[i]:获得i需要的最小的代价。

代码如下:

 1 #include<cstdio>
 2 #include<map>
 3 #include<iostream>
 4 #define LL long long
 5 using namespace std;
 6 int n;
 7 int a[305];
 8 int b[305];
 9 map<int,int> dp;
10 map<int,int>::iterator it;
11 int gcd(int a,int b){
12     return b==0?a:gcd(b,a%b);
13 }
14 int main(void){
15     scanf("%d",&n);
16     for(int i=0;i<n;++i)scanf("%d",a+i);
17     for(int i=0;i<n;++i)scanf("%d",b+i);
18     for(int i=0;i<n;++i){
19         if(dp.count(a[i]))dp[a[i]]=min(dp[a[i]],b[i]);
20         else dp[a[i]]=b[i];
21         for(it=dp.begin();it!=dp.end();++it){
22             int temp=gcd(a[i],it->first);
23             if(dp.count(temp))dp[temp]=min(dp[temp],dp[a[i]]+it->second);
24             else dp[temp]=dp[a[i]]+it->second;
25         }
26     }
27     if(dp.count(1))printf("%d\n",dp[1]);
28     else printf("-1\n");
29 }
时间: 2024-08-27 12:29:38

Fox And Jumping的相关文章

#290 (div.2) D. Fox And Jumping

1.题目描述:点击打开链接 2.解题思路:本题利用扫描与维护解决.根据题意,能够走到所有的格子,一定是挑选出来的牌的步数的最大公约是1,这点很好理解.因为ax+by=1意味着只要有a个x和b个y就可以凑出来步数1.这样以来,只需要利用map来存储所有的公约数对应的最小费用即可.初始时刻base[0]=0,接下来就是从前往后扫描一遍这n个数,然后依次更新base中的每一个最大公约是对应的最小费用即可. 3.代码: #define _CRT_SECURE_NO_WARNINGS #include<i

codeforces510D Fox And Jumping gcd

题意:n张卡,可跳跃的长度l[i],以及花费c[i] 起始点为0,问如果选卡使得可以每个点都能跳到,最小的花费是多少. 思路:本质就是选取一些卡,选择卡长度的gcd为1,且花费最小.那么我们用map映射gcd值以及其对应的最小花费.最后输出mp[1]即可.(ps:可能有卡片长度相同)详见代码: /********************************************************* file name: codeforces510D.cpp author : kere

Codeforces 512B Fox And Jumping dp+gcd

题目链接:点击打开链接 题意: 给定n个数 下面2行是n个数字和购买该数字的花费. 使得购买的数字能通过加减获得任意一个正整数.问最小的花费是多少.(购买得到的数字可以多次使用) 思路: 首先是要获得任意的正整数,其实就是获得1就可以了. 而获得1的话 只需要我们选的数的gcd = 1即可. 设 有整数x,y,要使得x y能构造任意一个整数,充要条件就是gcd(x, y)=1 推论: 设int G = gcd(x, y); 则 ax+by = G( ax/G+by/G ) 括号中能构成任意一个整

Codeforces_512B: Fox And Jumping

题目链接 题意说的是,有n种卡片,使用第i种卡片可以使当前自己在数轴上的位置移动 l[i],要获得使用第i种卡片的代价是 c[i],求能使自己移动到数轴上任意位置的最小代价,如果不可能则输出-1 当前所拥有的卡片由1->n,逐渐调整map里的值 #include<bits/stdc++.h> using namespace std; const int N=1e5+7; int n; int c[N],l[N]; map<int,int> dp; int gcd(int a,

【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

[Codeforces#510D] Fox And Jumping

Codeforces题号:#510D 出处: Codeforces 主要算法:贪心+优先队列 难度:4.6 思路分析: 题意:给出n张卡片,分别有l[i]和c[i].在一条无限长的纸带上,你可以选择花c[i]的钱来购买卡片i,从此以后可以向左或向右条l[i]个单位.购买其他卡片后,可以获得更多的跳跃单位.先要求至少花多少元钱才能够任意跳到纸带上任意一个位置.若不行,输出-1. 首先分析如果只有两个技能的情况.若这两个技能的跳跃长度有最大公约数(x),且满足(x > 1),则一定能跳到任意一个位置

所谓的日常 #7 - 袁紹磐河戰公孫 孫堅跨江擊劉表

div.2 CodeForces 334A Candy Bags 给定一个偶数n(<=100),把价值为1~n^2的糖们分发给n个小朋友,使得大家手上糖的总价值一样. 考虑这样配对:(1,n^2),(2,n^2-1),(3,n^2-2)...(i,n^2-i+1).每对价值和都是n^2+1,总共有n^2/2对,按对分给小朋友就好啦. 1 #include <stdio.h> 2 3 int main() { 4 int n; 5 scanf("%d",&n);

Codeforces Round #290 (Div. 2) 解题报告 A.B.C.D.

A - Fox And Snake 模拟. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #include <stdio.h> using na

java中截取字符串方法

Java 简介 substring public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串.该子字符串始于指定索引处的字符,一直到此字符串末尾. 例如: "unhappy".substring(2) returns "happy" "Harbison".substring(3) returns "bison" "emptiness".s