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;
}