一开始想这个题的时候按照一个错误的标准贪心。以为按照min(k*2,l)这样从大到小排一下取前n个进行加倍后面的都按照min(k,l)取就行了。但是这样如果本身l就小于k加倍和不加倍所得到的是一样的,就浪费了加倍的机会。
于是就有下面的思路。
思路:先按照加倍后商品能多卖出去的件数more来排序,如果more相等那么就按照能卖出去多的排序,因为存在more都为0,但是卖出的件数是不相同的可能。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX_N 100500
using namespace std;
struct node
{
int k,l,more,sell;
}q[MAX_N];
bool cmp(node a,node b)
{
if(a.more!=b.more)
return a.more>b.more;
return a.sell>b.sell;
}
int main()
{
int f,n;
while(~scanf("%d%d",&f,&n))
{
for(int i=0;i<f;i++)
{
scanf("%d%d",&q[i].k,&q[i].l);
if(q[i].k<q[i].l)
{
if(q[i].k*2>q[i].l)
q[i].more=q[i].l-q[i].k;
else
q[i].more=q[i].k;
}
else
q[i].more=0;
q[i].sell=min(q[i].k*2,q[i].l);
}
sort(q,q+f,cmp);
long long ans=0;
for(int i=0;i<n;i++)
ans+=q[i].sell;
for(int i=n;i<f;i++)
ans+=min(q[i].l,q[i].k);
cout<<ans<<endl;
}
return 0;
}