题意:一个物品有一个价格,这个价格可以最多降低d,求在所下降价格不超过d的情况下,能够使价格有最多的9且价格最高。思路是从价格的最后一位开始往前遍历,每次查找最后n位与n个9组成的数之间的差值,如果这个差值在范围内就接受。
题解:从各位暴力枚举9的个数就行了,另外这里有一个小小的数学知识(其实就是算出来的):如果一个数n想减去一个数使得这个数的后k位是9,那么这个数一定是个后k位的数加1,比如12345想使得后三位变成9,则需要减去346(即345+1).
AC代码:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=1e6+5;
main(){
int p,d,m=0;
cin>>p>>d;
if(p<10)cout<<p<<endl;
else {
for(int i=10;i<=p;i*=10){
if(p%i+1==i)continue;//说明这些位本来就是9
if(p%i+1<=d)m=p%i+1;
else break;
}
cout<<p-m<<endl;
}
}