#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")