Special Offer! Super Price 999 Bourles! CodeForces - 219B(思维,简单数学)

题意:一个物品有一个价格,这个价格可以最多降低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;
	}
}

猜你喜欢

转载自blog.csdn.net/Alanrookie/article/details/107861995