1 题目描述:

  被给一系列的正整数x1,x2,x3...xn和两个非负整数a和b,通过下面两步操作将a转化为b:

  1.对当前的a减1。

  2.对当前a减去a % xi (i=1,2...n)。

  计算a转化到b最小需要的最短步数。

2 输入

  第一行包含简单的整数n(1 ≤  n ≤ 10^5),第二行包含n个用空格分开的整数x1,x2,x3...xn(2 ≤  xi ≤ 10^9),第三行包含两个整数a和b(0  ≤ b ≤  a ≤ 10^9, a - b ≤ 10^6)。

3 输出

  输出一个整数,a转化为b的最小步数。

4 思路

  假设dp[k]表示从k+b转化到b所需要的最小步数,然后可以通过计算next=(b+k)-(b+k) % xi(i=1,2..n, next >= b)所能达到的最小值来计算dp[k],即dp[k]=dp[next-b]+1,这其实是一个贪心的选择,总是让每一步尽量产生大的跨度。为什么可以这样计算?由于dp[k]是一个递增函数。假设存在t,使得dp[k] = dp[k - t] + 1(k+b通过一步可以转化到k-t+b),如果t=1,显然dp[k-1]<dp[k];如果t > 1, 必然有dp[k-1] <= dp[k - t]+1,因为k+b可以通过一步转化为k-t+b,那么k-1+b也必然存在一步转化为k-t+b(只要k+b先-1转化为k+b-1,然后k+b-1必然就可以转化为k-t+b)。

5实现

 #include <stdio.h>
#include <iostream> // std::cout
#include <algorithm> // std::sort
#include <vector> // std::vector
#include <functional> #define min(a, b) ((a) < (b) ? (a) : (b))
int n, x[], a, b; int main ( int argc, char *argv[] )
{
int i, t, tt, ans; scanf("%d", &n);
for(i = ; i < n; i++)
scanf("%d", &x[i]);
scanf("%d%d", &a, &b);
std::sort(x, x + n, std::greater<int>());
n = std::unique(x, x + n) - x; ans = ;
while (a != b)
{
tt = a - ;
for (i = ; i < n; i++)
{
t = a - (a % x[i]);
if (t < b)
x[i--] = x[--n];
else
tt = min(t, tt);
}
a = tt;
ans++;
}
printf("%d\n", ans);
return ;
} /* ---------- end of function main ---------- */

cf201.div1 Number Transformation II 【贪心】的更多相关文章

  1. Codeforces 346C Number Transformation II 贪心(复杂度计算)

    题意及思路:https://www.cnblogs.com/liuzhanshan/p/6560499.html 这个做法的复杂度看似是O(n ^ 2),实际上均摊是O(n)的.我们考虑两种极端数据: ...

  2. CodeForces346 C. Number Transformation II

    C. Number Transformation II time limit per test 1 second memory limit per test 256 megabytes input s ...

  3. CodeForces 346C Number Transformation II

    Number Transformation II 题解: 对于操作2来说, a - a % x[i] 就会到左边离a最近的x[i]的倍数. 也就是说 [ k * x[i] + 1,  (k+1)* x ...

  4. Codeforces 346C Number Transformation II 构造

    题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> # ...

  5. CSUOJ 1299 - Number Transformation II 打表预处理水DP

    http://122.207.68.93/OnlineJudge/problem.php?id=1299 第二个样例解释.. 3 6 3->4->6..两步.. 由此可以BFS也可以DP. ...

  6. hdu4952 Number Transformation (找规律)

    2014多校 第八题 1008 2014 Multi-University Training Contest 8 4952 Number Transformation Number Transform ...

  7. 4.Single Number && Single Number (II)

    Single Number: 1. Given an array of integers, every element appears twice except for one. Find that ...

  8. bzoj 3858: Number Transformation 暴力

    3858: Number Transformation Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 82  Solved: 41[Submit][Sta ...

  9. HDU-4952 Number Transformation

    http://acm.hdu.edu.cn/showproblem.php?pid=4952 Number Transformation Time Limit: 2000/1000 MS (Java/ ...

随机推荐

  1. struts2中的jar包

    核心包: (后面数字是版本号,不同struts2版本,数字可能不一样.) struts2-core-2.1.8.1 struts2的核心jar包,不可缺少的 xwork-core-2.1.6 xwor ...

  2. Spring MVC篇一、搭建Spring MVC框架

    本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij创建,配合maven管理.整体的目录结构如图: 其中ja ...

  3. codeforces 360 C

    C - NP-Hard Problem Description Recently, Pari and Arya did some research about NP-Hard problems and ...

  4. css中单位px、pt、em和rem的区别

    国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢? px :像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的.(引自CSS ...

  5. spring里的controller之间的跳转

    未测试: this.getServletContext().getRequestDispatcher("/rentHouse.htm?method=display").forwar ...

  6. perl学习之路3

    Perl编程之路3 标签: perl 列表与数组   Perl里面代表复数的就是列表和数组 列表(list)指的是标量的有序集合, 而数组(array)则是存储列表的变量. 在Perl这两个属于尝尝混 ...

  7. touchstart、touchmove、touchend 实现移动端上的触屏拖拽

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. Vuforia点击屏幕自动对焦,过滤UGUI的按钮

    //点击屏幕自对对焦 #if UNITY_EDITOR )) #elif UNITY_ANDROID || UNITY_IPHONE && Input.GetTouch().phase ...

  9. Scrum Guide - Scrum指南中文版

    现在公司在使用敏捷开发模式进行日常的开发和管理工作,所以我看了下Ken Schwaber的<Scrum Guide>这本小册子,原本是英文的,这里提供中文的,以供日后复习和参考. Scru ...

  10. NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...