1.题目描述:
一个人打算这两周去商店总共买n件衣服,今日至少要买k件,剩下的可以下周买,正逢打折活动,持续一周,但是老板很黑,有些衣服本周打折的价格反而比下周不打折的价格还高,要你帮他算一下,他买这n件衣服的最少花费。
3.解题思路:
今日至少要买k件,那么肯定先买“真”打折的衣服,如果“真”打折衣服买完还不够k件,则贪心地买差价最小的“假”打折衣服。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 200100
#define N 1111
#define eps 1e-6
#define pi acos(-1.0)
#define e 2.718281828459
#define mod (int)1e9 + 7
using namespace std;
typedef long long ll;
struct node
{
int a, b, vis;
}p[maxn];
bool cmpa(node x, node y)
{
if (x.a == y.a)
return x.b < y.b;
return x.a < y.a;
}
bool cmp(node x, node y)
{
return x.a - x.b < y.a - y.b;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
int n, k;
while (~scanf("%d%d", &n, &k))
{
for (int i = 0; i < n; i++)
scanf("%d", &p[i].a);
for (int i = 0; i < n; i++)
{
scanf("%d", &p[i].b);
p[i].vis = 0;
}
sort(p, p + n, cmpa);
int cnt = 0, ans = 0;
for (int i = 0; i < n; i++) //先买诚实的产品
{
if (p[i].a < p[i].b)
{
ans += p[i].a;
cnt++;
p[i].vis = 1;
}
}
sort(p, p + n, cmp);
if (cnt < k) //只能买说谎的产品了
{
for (int i = 0; i < n; i++)
{
if (!p[i].vis)
{
if (cnt < k)
{
ans += p[i].a;
p[i].vis = 1;
cnt++;
}
else
break;
}
}
}
// 买剩下的产品
for (int i = 0; i < n; i++)
if (!p[i].vis)
ans += p[i].b;
printf("%d\n", ans);
}
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return 0;
}