C实践习题集3之不诚实的卖家

不诚实的卖家

题目

伊戈尔发现有一家商店正在打折,所以决定在这家商店购买n件商品。商店的打折活动会持续一周,打折期间每件商品的价格是ai,等打折活动结束后,商品的价格变为bi。但是并非所有卖家都诚实,因此打折期间某些商品的价格可能会比折扣活动结束后的价格更贵。
伊戈尔决定现在至少购买k件商品,剩下的商品等活动结束后再购买。你的任务是帮伊戈尔计算一下用于购买n件商品的最低费用。

输入格式:

第一行包含两个正整数n和k(1≤n≤2e5,0≤k≤n),分别表示伊戈尔要购买的商品数量和他现在只少要买的商品数。

第二行包含n个整数 a1,a2,...,an(1≤ai≤1e4),分别表示折扣期间各个商品的价格。

第三行包含n个整数 b1,b2,...,bn(1≤bi≤1e4),分别表示折扣结束后商品的价格。

输出格式:

伊戈尔购买n件商品所需的最低金额。

输入样例:

3 1
1 3 5
6 4 2

输出样例:

6

思路

该题应该是贪心的题型。思路很明了。

首先要做的是把那些真正降价的商品买下来,同时记录那些没有真正降价的商品的前后价格记录下来,同时计算价格差值。

接着就是比较最少应买的商品数量与此时已经买了的商品数量,从而决定要不要继续在此时购买商品。
接下来分两种情况分析:

1.若需要继续购买商品,则先按前后价格差值排序,然后优先买前后价格差值大的商品,直至达到此时所需购买的商品数,若还有剩余商品未购买,则等之后再购买。

2.若不需要继续购买商品,则之后再把剩下商品买下来即可。

完整代码

#include<stdio.h>
void change(int*p1,int*p2);
int a[200005],b[200005];
int s1[200005],s2[200005],s3[200005];
int main()
{
	int n,s,i,j=0,k,h,count=0,sum=0;
	scanf("%d %d",&n,&s);
	for(i=0;i<n;i++) scanf("%d",&a[i]);
	for(i=0;i<n;i++) scanf("%d",&b[i]);
	for(i=0;i<n;i++){
		if(a[i]<b[i]){
			count++;
			sum+=a[i];
		}
		else{
			s1[j]=a[i];
			s2[j]=b[i];
			s3[j]=a[i]-b[i];
			j++;
		}
	}
	if(s>count){
		for(i=1;i<j;i++){
			for(k=0;k<j-i;k++){
				if(s3[k]>s3[k+1]){
					change(&s1[k],&s1[k+1]);
					change(&s2[k],&s2[k+1]);
					change(&s3[k],&s3[k+1]);
				}
			}
		}
		for(i=0;i<j;i++){
			if(s>count){
				sum+=s1[i];
				count++;
			}
			else break;
		}
		for(h=i;h<j;h++){
			sum+=s2[h];
		}
	}
	else for(i=0;i<j;i++) sum+=s2[i];
	printf("%d",sum);
	return 0;
}
void change(int*p1,int*p2)
{
	int store;
	store=(*p1);
	(*p1)=(*p2);
	(*p2)=store;
}

posted @ 2020-03-14 20:51  枭魈  阅读(181)  评论(0编辑  收藏  举报