题解 | 支付宝消费打折
支付宝消费打折
https://www.nowcoder.com/practice/f8997c9b82714f058e12433a32614993
#include <cstdio>
#include <iostream>
#include<algorithm>
#include<string>
using namespace std;
bool cmp(double a, double b) {
return a < b;
}
int main() {
int n, k;
scanf("%d", &n);
scanf("%d", &k);
int a[n]; //价格正整数
//string str;
char str[n+1];
double pay[n]; //实际应付为浮点数
int cnt = 0;
for (int i = 0; n - i > 0; i++) {//读取N个价格
scanf("%d", &a[i]);
}
getchar(); //放错点,要将价格后的换行读取后再读字符
for (int i = 0; n - i > 0; i++) {//读取是否支持优惠
scanf("%c", &str[i]);
}
for (int i = 0; n - i > 0; i++) {
if (str[i] == '0')pay[i] = a[i];
else pay[i] = a[i] * 0.95;
}
sort(pay, pay + n, cmp);
// for (int i = 0; i < n&&k>0; i++) { //循环错误,K>0代表有钱,但不一定买的起下一件物品
// k = k - pay[i];
// cnt+=1;
// }
double remain = k;
for (int i = 0; n-i>0; i++) {
if (remain>=pay[i]) {
remain = remain-pay[i];//如果反过来将浮点数赋值给整数,则会发生截断(丢失小数部分),这时候通常需要显式强制转换,例如 int x = (int)3.14;(结果为 3)。
cnt+=1;
}
else{
break;
}
}
printf("%d",cnt);
}
// 64 位输出请用 printf("%lld")
查看9道真题和解析