贪心
单调自增的数字
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
代码
int i,flag; // 利用flag来寻找更改位置
for(i=size-1;i>0;i--){ //因为保证单调递增所以要从后往前遍历数组
if(arr[i-1]>arr[i]){
arr[i-1]--;
flag=i;
}
}
for(i=flag;i<size;i++){
arr[i]=9;
}
柠檬水找零
在柠檬水摊上,每一杯柠檬水的售价为 5 元。
顾客排队购买你的产品一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 元、10 元或 20 元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 元。
注意:一开始你手头没有任何零钱。
如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
代码
int five=0,ten=0,twenty=0;
int a[5]={5,5,5,10,20}; // 顾客付的钱
int i;
for(i=0;i<5;i++) {
if(a[i]==5){
five++; // 直接收下
}
if(a[i]==10){ //给顾客五元
if(five<=0){ // 5元不够就false
return false;
}
ten++; // 十元加一张
five--; // 五元减一张
}
if(a[i]==20){//给顾客十五元
if(five>0&&ten>0){ // 先考虑有没有一张十元和一张五元
five--;
ten--;
twenty++;
}else if(five>=3){ // 再考虑有没有三张五元
five-=3;
}else
return false;
}
}
return true;