Money
题目
Edward当上了E国的国王. 然而E国使用的钞票中有的钞票的面值包含数字5, 这个数字对Edward来说是个不幸运的数字, 于是他打算改变钞票的面值. Edward的幸运数字是3, 7, 他打算把E国的钞票面值改成:
1元, 3元, 7元, 10元, 30元, 70元, 100元, 300元, 700元, 1000元, 3000元, 7000元, 10000元.
那么对于货币而言, 要凑够x (1 ≤ x ≤ 10^18) 元至少需要多少张钞票?
输入描述
Input
输入包含多组测试数据.
第一行为一个整数n (1 ≤ n ≤ 200000). 表示测试数据的数量
紧接着为n行, 每行一个数字x (1 ≤ x ≤ 10^18).
输出描述
Output
对于每组测试数据, 输出凑够x (1 ≤ x ≤ 10^18) 元至少需要钞票的数量.
样本输入
Input example
3
5 23 139
样本输出
Output example
3
3 5
解答
#include<stdio.h>
int min99[100000];
int money[]={1,3,7,10,30,70,100,300,700,1000,3000,7000,10000};
int main(){
long long head,HEAD;
int x;
int n;
int J;
for(int i=0;i<100000;i++) min99[i]=i;
for(int i=1;i<100000;i++){
for(int j=1;j<13;j++){
J=i-money[j];
if(J>=0){
if((min99[J]+1)<min99[i]) min99[i]=min99[J]+1;
}
}
}
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld",&head);
HEAD=head;
x=head%100000;
head=(head-x)/10000;
head+=min99[x];
if(HEAD>=100000){
if(x>=4000&&x<6000){
head--;
if(x>=4400&&x<4600){
head++;
if(x<4500){
x=x%1000;
if(x>=440&&x<460) head--;
x=x%100;
if(x==44||x==45) head++;
}
}
}
}
printf("%lld\n",head);
}
return 0;
}