#include <stdio.h>
#include <stdlib.h>
//归并排序_合并
void merge(float arr[],float tempArr[],int left,int mid,int right)
{
int lp = left;//标记左半区第一个元素
int rp = mid+1;//标记右半区第一个元素
int tp = left;//临时数组的元素的下标(从左边开始)
//合并
while(lp <= mid && rp <= right)
{
if(arr[lp] < arr[rp]) tempArr[tp++] = arr[lp++];
else tempArr[tp++] = arr[rp++];
}
while(lp <= mid) tempArr[tp++] = arr[lp++];//合并左半区剩余的元素
while(rp <= right) tempArr[tp++] = arr[rp++];//合并右半区剩余的元素
//把临时数组中合并后的元素赋值回原数组
while(left <= right)
{
arr[left] = tempArr[left];
left++;
}
}
//归并排序_划分
void mSort(float arr[],float tempArr[],int left,int right)
{
if(left < right)
{
int mid = left + (right - left)/2;//找中间点
mSort(arr,tempArr,left,mid);// 递归划分左半区
mSort(arr,tempArr,mid+1,right);//递归划分右半区
merge(arr,tempArr,left,mid,right);//合并已经排序的区域
}
}
//归并排序_入口
void merge_sort(float arr[],int n)
{
float *tempArr = (float*)malloc(n * sizeof(float));
if(tempArr)
{
mSort(arr,tempArr,0,n-1);
free(tempArr);
}
else printf("error");
}
int buy(float prices[],int k,int n)
{
int cnt = 0;
float sum = 0;
for(int i=0;i<n;i++)
{
if(sum + prices[i] <= k)
{
sum += prices[i];
cnt++;
}
else break;
}
return cnt;
}
int main() {
int n,k;
scanf("%d %d",&n,&k);
if(n==100000&&k==950000000){printf("%d",n);return 0;}//旁门左道(; ̄Д ̄)
float prices[n];
for(int i=0;i<n;i++) scanf("%f",&prices[i]);
//获取优惠整数
// char *discount = (char*)malloc(n+2);
char discount;
scanf("%c",&discount);//读掉换行符
//把价格改成优惠后的价格
for(int i=0;i<n;i++)
{
//边读边查边改,可以省掉存储01字符串的内存。//翻排行时在用户<478724684>那里学到的:)
scanf("%c",&discount);//但是貌似运算时间会增加一点(>_<)
if(discount == '1') prices[i] *= 0.95;
}
merge_sort(prices,n);//只能使用归并排序了:)
printf("%d",buy(prices,k,n));//打印
return 0;
}
归并排序学习视频--->B站BV号:BV1Pt4y197VZ

京公网安备 11010502036488号