3 条题解
-
2
注意到有可能答案后面有一堆
所以我们直接判断如果两个数之间差了大于 ,那么一定会有一堆 ,所以直接除以 然后暴力跑,最后答案处理一下
对于答案处理,因为我们需要找到最小值,那么我们可以判断如果答案除以 大于 那么我们就一直除下去
x1=reads(),x2=reads(); // cout<<x2-x1<<endl; if(x2-x1<=10000){ for(int i=x1;i<=x2;i++){ int opt=F(i); if(opt<ans) ans=opt,bns=i; if(opt==ans) bns=min(bns,i); } printf("%lld\n",bns); } else{ int t1=x1; if(x1%10000!=0) x1=x1/10000+1; else x1/=10000; x2/=10000; for(int i=x1;i<=x2;i++){ int opt=F(i); if(opt<ans) ans=opt,bns=i; if(opt==ans) bns=min(bns,i); } bns*=10000; while(bns%10==0&&(bns/10)>=t1) bns/=10; printf("%lld\n",bns); } -
0
奇怪的函数 题解
窝觉得窝20pts的无脑解法和AC代码差不多。
那最基础的想法就是从x1到x2计算一遍,注意答案要求的是f(x) 取到最小值时的最小的整数x,而不是f(x)的最小值。 计算方式看着有点恶心,实则不然。
优化也比较显然,假如现在是500,那么501,502...这些数都没什么用,直接预处理jump[]跳过这些数字即可。
CODE
#include<bits/stdc++.h> #define int long long using namespace std; int T,a,b,id,minn,jump[170]; inline int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-')f=-1; ch=getchar(); } while(isdigit(ch)){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } inline void write(int x){ if(x<0)putchar('-'),x=-x; if(x>9)write(x/10); putchar(x%10+48); } void init(){ jump[0]=1; for(int i = 1;i<=9;i++) jump[i]=jump[i-1]*10; } int del(int x){ int bit=0; while(x%10==0){ x/=10; bit++; } return bit; } int f(int x){ int bit=0; while(x%10==0)x/=10; int yu=x%10; while(x){ x/=10; bit++; } if(yu==5)return (2*bit-1); return (2*bit); } signed main(){ //freopen("fjy.txt","r",stdin); init(); T=read(); while(T--){ a=read();b=read(); minn=0x7f7f7f7f,id; for(int i = a;i<=b;i+=jump[del(i)]){ int t=f(i); if(t<minn){ id=i; minn=t; } } write(id);putchar('\n'); } return 0; }
- 1
信息
- ID
- 109
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 119
- 已通过
- 22
- 上传者