题目描述

在市场上有很多商品的定价类似于 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] 范围内,你想要给出一个荒谬度最低的价格。

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1:

3
998 1002
998 2002
4000 6000
输出样例#1:

1000
1000
5000

说明

对于 20% 的数据,L, R ≤ 2000.

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

Solution:

  本题贼有意思,直接打表找下规律,然后直接数列分块就好了。

  打表思路就直接照题目求每个数的过程模拟。

  我们打表不难发现,当每次隔$100000$个数统计一次答案时,只有$[1,100000]$答案为$5$,其余的均为整十万(比如$[100001,200000]$答案为$200000$,$[200001,300000]$答案为$300000$等等),然后缩小范围每次隔$10000$、$1000$、$100$,都只有第一次的答案为$5$,其余的为整万、整千、整百。

  于是,数列分块的思路就比较清晰了。

  本着大段维护小段暴力的思路,我选择每$10000$个数一个块,每次读入的区间若相差小于$50000$就直接暴力枚举,否则的话就搞分块思想,两端多出来的两个非完整的块暴力枚举求出最优解,然后枚举求出区间包含的块内的最优解并更新答案,输出就好了。

  最坏情况就是100组数据均为$[1,10^9]$,这样就得跑五千多万次,反正能过。

  当然按$\sqrt n$ 分块更合理,复杂度也更加理想。

代码:

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
int T,n,m;
int s[]; il int gi(){
int a=;char x=getchar();
while(x<''||x>'')x=getchar();
while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
return a;
} il int check(){
int p,t,h,minn=0x7fffffff,ans;
For(i,n,m) {
p=i,t=;
while(p%==)p/=;
h=p%;
while(p) p=p/,t++;
if(h%==){
if(minn>t*-)ans=i,minn=t*-;
}
else {
if(minn>t*)ans=i,minn=t*;
}
}
return ans;
} int main(){
s[]=;
For(i,,) s[i]=(i+)*;
T=gi();int p,t,h,minn,ans;
while(T--){
n=gi(),m=gi();
if(m-n<=) printf("%d\n",check());
else {
int l=n/+,r=m/-;
minn=0x7fffffff;
For(i,n,l*){
p=i,t=;
while(p%==)p/=;
h=p%;
while(p) p=p/,t++;
if(h%==){
if(minn>t*-)ans=i,minn=t*-;
}
else {
if(minn>t*)ans=i,minn=t*;
}
}
For(i,r*+,m){
p=i,t=;
while(p%==)p/=;
h=p%;
while(p) p=p/,t++;
if(h%==){
if(minn>t*-)ans=i,minn=t*-;
}
else {
if(minn>t*)ans=i,minn=t*;
}
}
For(i,l,r){
p=s[i],t=;
while(p%==)p/=;
h=p%;
while(p) p=p/,t++;
if(h%==){
if(minn>t*-)ans=s[i],minn=t*-;
}
else {
if(minn>t*)ans=s[i],minn=t*;
}
}
printf("%d\n",ans);
}
}
return ;
}

P4109 [HEOI2015]定价的更多相关文章

  1. 洛谷——P4109 [HEOI2015]定价

    P4109 [HEOI2015]定价 模拟(有点儿贪心) 题目要求在区间$l,r$中$x$后导0尽量多,且除去后导0之外,最后一个数尽量是$5$才最优 从$l$到$r$依次考虑, 假设当前考虑到$50 ...

  2. Price(洛谷P4109 [HEOI2015]定价)

    题目 思路: 按照我的思路这一题应该是这样子的 剔除+判断 剔除 因为后面的0要越多越好,所以我们判断0出现的情况,当2个数之间的差大与10时,证明2个之间会存在一个0,所以这一位我们可以把它去掉,相 ...

  3. 洛谷 P4109 [HEOI2015]定价

    洛谷 这是今天的考试题,我来发一波- 看L和R的范围,显然不能一个一个加,这样会有很多重复情况,会超时,只要看该数有多少个后导0,就把L加上10的多少次方. 很容易可以想到价格后面尽可能多0, 在此基 ...

  4. Luogu P4109 [HEOI2015]定价 贪心

    思路:找规律?$or$贪心. 提交:1次 题解: 发现:若可以构成$X0000$,答案绝对不会再在数字最后把$0$改成其他数: 若可以构成$XX50...0$更优. 所以左端点增加的步长是增加的($i ...

  5. 【BZOJ4029】[HEOI2015]定价(贪心)

    [BZOJ4029][HEOI2015]定价(贪心) 题面 BZOJ 洛谷 题解 每次加上十进制下的\(lowbit\)就行了??? #include<iostream> #include ...

  6. BZOJ 4029: [HEOI2015]定价 贪心

    4029: [HEOI2015]定价 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4029 Description 在市场上有很多商品的 ...

  7. 「BZOJ4029」[HEOI2015] 定价 贪心

    「BZOJ4029」[HEOI2015] 定价 2015年4月28日2,7490 Description 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 ...

  8. [BZOJ4029][HEOI2015] 定价

    Description 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很 ...

  9. [HEOI2015]定价

    题目描述 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很多,因此也是商 ...

随机推荐

  1. This system is registered to Red Hat Subscription Management, but is not receiving updates. You can use subscription-manager to assign subscriptions.

    Wrong date and time, reset the date and time in the system properly. It may also happen that system ...

  2. php判断某个数是素数的3种方法

    什么是素数? 质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数:否则称为合数.(注:1不是素数.) 方法一: 基本方法,——计数方法. $num = 7; $n = ...

  3. Linux常用文档操作命令--1

    1.查看目录下的文档 a) ls(list):查看目录下的所有文档或者文档的信息. 命令行:ls [-a][-A] [-f][-F][-h][-l][-r][-R][-S][-t] 目录名称  //注 ...

  4. php导出excel长数字串显示为科学计数方法与最终解决方法

    1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel-> ...

  5. centos搭建SVN服务

    Linux VM_47_236_centos 3.10.0-514.21.1.el7.x86_64 需求:android.ios.service三个版本库 安装: yum -y install sub ...

  6. WHERE条件中or与union引起的全表扫描的问题

    说起数据库的SQL语句执行效率的问题,就不得不提where条件语句中的or(逻辑或)引起的全表扫描问题,从而导致效率下降. 在以往绝大多数的资料中,大多数人的建议是使用 union 代替 or ,以解 ...

  7. linux文件操作篇 (三) 文件状态和操作属性

    #include <sys/stat.h>   int fstat(int fildes, struct stat *buf); 获取文件信息  int lstat(const char* ...

  8. 复位自动ID的问题有兩種方法

    复位自动ID的问题 有兩種方法:      方法1:      truncate   table   你的表名   --這樣不但將數據刪除,而且可以重新置位identity屬性的字段.         ...

  9. ChipScope软件使用

    内容组织 1.建立工程  2.插入及配置核  2.1运行Synthesize  2.2新建cdc文件  2.3 ILA核的配置  3. Implement and generate programmi ...

  10. SSM框架学习思维导图

    SSM框架学习思维导图 2017年08月11日 20:17:28 阅读数:1141 放上前段时间学习SSM框架以及Spring.SpringMVC.MyBatis的学习结果,输出思维导图一共四幅图.这 ...