[BZOJ4029][HEOI2015] 定价

Description

  在市场上有很多商品的定价类似于 999 元、4999 元、8999 元这样。它们和 1000 元、5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很多,因此也是商家常用的价格策略。不过在你看来,这种价格十分荒谬。于是你如此计算一个价格 p(p 为正整数)的荒谬程度:

  1、首先将 p 看做一个由数字组成的字符串(不带前导 0);

  2、然后,如果 p 的最后一个字符是 0,就去掉它。重复这一过程,直到 p 的最后一个字符不是 0;

  3、记 p 的长度为 a,如果此时 p 的最后一位是 5,则荒谬程度为 2 * a - 1;否则为 2 * a。

  例如,850 的荒谬程度为 3,而 880 则为 4,9999 的荒谬程度为 8。

  现在,你要出售一样闲置物品,你能接受的定价在 [L, R] 范围内,你想要给出一个荒谬度最低的价格。

Input

  输入文件的第一行包含一个正整数 T,表示测试数据的数目。

  每个测试数据占单独的一行,包含两个空格分隔的正整数 L, R,表示定价的区间。

Output

   对于每个测试数据,在单独的一行内输出结果。如果荒谬度最低的价格不唯一,输出最小的那个。

Sample Input

3
998 1002
998 2002
4000 6000

Sample Output

1000
1000
5000

HINT

  对于 100% 的数据,T ≤ 100,1 ≤ L ≤ R ≤ 10^9.

题解:

  R-L最大可能为10^9,且T<=100,故显然不能直接for循环判断。荒谬值会因为结尾为0的个数而缩小,故选择数的时候就可以从这里入手。同样是for循环,我们在枚举的时候是可以跳过许多绝对不可能成为答案的数,如现在的数为140,那么141,142,……,149显然都可以跳过;现在的数为10000,那么10001,10002,……,19999都可以跳过。故每次我们不是直接+1,而是增加当前数最后一位非0的数位+1,同时判断最后一位非0数是否为5,如果是,则答案-1。

代码:

---------------------------------------------------------------------------------------------------

#include <cstdio>

int l, r, t, ans, min, o;

int add(int o)
{
  int res = 1;
  while (o % 10 == 0) res *= 10, o /= 10;
  return res;
}

int work(int o)
{
  while (o % 10 == 0) o /= 10;
  int t = o % 10, a = 0;
  while (o) o /= 10, a++;
  if (t == 5) return 2 * a - 1;
  return 2 * a;
}

int main()
{
  freopen("Price.in", "r", stdin);
  freopen("Price.out", "w", stdout);
  scanf("%d" ,&t);
  while (t--)
  {
    scanf("%d %d", &l, &r), o = l, min = work(o), ans = o;
    for (;;)
    {
      o += add(o);
      if (o > r) break;
      int t = work(o);
      if (t < min) min = t, ans = o;
    }
    printf("%d\n", ans);
  }
  return 0;
}

--------------------------------------------------------------------------------------------------

时间: 2024-10-15 05:22:46

[BZOJ4029][HEOI2015] 定价的相关文章

BZOJ4029 HEOI2015定价

贪心. 每次将最后一个非零位加一判断即可. 一开始想少了,只关心把最后一位变成5了,其实可以都变的. 1 #include<bits/stdc++.h> 2 using namespace std; 3 int T,l,r; 4 int add(int x) 5 { 6 int k=1; 7 while(x%10==0)k*=10,x/=10; 8 return k; 9 } 10 int calc(int x) 11 { 12 int k=0,b=0; 13 int y=x; 14 whil

「BZOJ4029」[HEOI2015] 定价 贪心

「BZOJ4029」[HEOI2015] 定价 2015年4月28日2,7490 Description 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很多,因此也是商家常用的价格策略.不过在你看来,这种价格十分荒谬.于是你如此计算一个价格 p(p 为正整数)的荒谬程度: 1.首先将 p 看做一个由数字组成的字符串(不带前导 0): 2.然后,如果 p 的最后一个字符是

[HEOI2015]定价

定价 [问题描述] 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很多,因此也是商家常用的价格策略.不过在你看来,这种价格十分荒谬.于是你如此计算一个价格 p(p 为正整数)的荒谬程度: 1.首先将 p 看做一个由数字组成的字符串(不带前导 0): 2.然后,如果 p 的最后一个字符是 0,就去掉它.重复这一过程,直到 p 的最后一个字符不是 0: 3.记 p 的长度为

BZOJ 4029 HEOI2015 定价 数位贪心

题目大意:定义一个数的荒谬程度为去掉末尾所有0后的数字数量?2(若末尾为5则荒谬程度减掉1),求[l,r]区间内荒谬程度最小的数字(若多个相同取最小) 从高位往低位贪心即可. 注意500的荒谬程度比100低 #include <assert.h> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; in

P4109 [HEOI2015]定价 贪心

思路:找规律?$or$贪心. 提交:1次 题解: 发现:若可以构成$X0000$,答案绝对不会再在数字最后把$0$改成其他数: 若可以构成$XX50...0$更优. 所以左端点增加的步长是增加的($inc=pow(10,x),x$递增). 所以去掉了一些不必要的枚举. #include<cstdio> #include<iostream> #include<cmath> #define R register int using namespace std; #defin

定个10.1小目标

A掉各种大题:(其实是noip还没水完的蒟蒻qwq)(我就想想好了...写不写得完看天了) 2106. [NOIP2015] 斗地主(目前60分) 407. [NOIP2009] 靶形数独(目前85分) 521. [NOIP2010] 引水入城(假的贪心贪了90) 1808. [NOIP2014]解方程(我还不知道这是个啥题qwq) 1442. [NOIP2013]华容道(他们都说简单...) 1267. [NOIP2012] 疫情控制(我听过题解了...) 632. [NOIP2011] 观光

贪心(qwq)习题题解

贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确定了前三位\((101...)_2\),下一位应该是1 那么\(a_i+x_i\)的查找区间为:\([(101100)_2,(101111)_2]\) ,同理如果应该是0则为\([(101000)_2,(101011)_2]\). 注意到有区间\([l,r]\)范围的限制所以用主席树维护即可. [

【BZOJ4029】【HEOI2015】定价 模拟

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45334857"); } 题解: 枚举后面有几个 0,然后每次(当前求 k 个后导 0 )算出第一个比 L 大的 10k 的倍数,和第一个比 L 大的 5×10k 的倍数. 然后把所有这些数都比较一下就好啦. 代码: #include

Android IOS WebRTC 音视频开发总结(五十)-- 技术服务如何定价?

这篇文章最早是杜老师写的,看完感触很深,加上之前跟咨询公司的朋友也讨论过这方面的问题,所以结合自己的经验,做了些删改(得到了杜老师的授权). 先通过下面几个简单的问题来了解技术服务: 问题1:技术服务是什么? 提供解决方案,并告诉你坑在哪里,怎么你少走弯路. 问题2:这跟社区里面的发帖和讨论是不是一样? 有点相似,但网友的回答五花八门,不一定正确,或者有上句没下句,他可能并不了解你的需求,或误解了你的需求. 问题3:blacker,问你们问题需要收费吗? 在公众号,博客,邮件或论坛里都是免费的,