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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值