CF 135 DIV2 B Special Offer! Super Price 999 Bourles!
题意:就是一个物品有一个价格,这个价格可以最多降低d,求在所下降价格不超过d的情况下,能够使价格有最多的9且价格最高.拿样例来说,1029 102
原价为1029,最多可下降102元,在符合条件的范围内,能够取得最多的9且价格最高的是999.若没有 符合条件的情况,则输出原价。
思路:首先求出原价的位数,然后计算最多有多少个9,和原价比较以及判断是否符合条件。之后就是一个模拟的过程,一点一点加,直到找到符合条件的借。中间有一些细节需要注意,而且中间运算还有可能超过__int64,都需要处理一下。
代码:
[cpp]
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
typedef unsigned __int64 LL;
int fun(LL x){
int sum = 0;
while(x){
sum++;
x /= 10;
}
return sum ;
}
LL cal(int x){
LL sum = 0;
for(int i = 1; i <= x; ++i){
sum = sum * 10 + 9;
}
return sum;
}
LL mi(int cnt){
LL s = 1;
for(int i = 1; i <= cnt; ++i)
s *= 10;
return s;
}
int main(){
LL p,d;
while(scanf("%I64d%I64d",&p,&d) != EOF){
LL value = p - d;
int cnt = fun(p);
LL ans = cal(cnt);
if(ans >= value && ans <= p){
printf("%I64d\n",ans);
}
else{
LL x = value % 10;
LL y = value / 10;
LL z = y * 10 + 9;
if(z > p){ www.zzzyk.com
z = z - 9;
printf("%I64d\n",p);
continue;
}
LL num = 0,xx = 0,yy = 0;
LL cnt = 1;
while(z <= p){
cnt++;
xx = z / mi(cnt);
yy = z % mi(cnt);
z = xx * mi(cnt) + cal(cnt);
num = z;
}
num = xx * mi(cnt) + yy;
cnt--;
while(num <= p){
num += mi(cnt);
}
printf("%I64d\n",num - mi(cnt));
}
}
return 0;
}
补充:软件开发 , C++ ,