你是D商店的老板,最近你突然获得了两项超能力:
预知未来 n 天中 第 i 天所拥有的物品数量 ai 以及 第 i 天要来你商店的顾客人数 bi。
可以让最多 k 天的物品数量翻一倍。(每一天只能翻一次)
注意:
每位来商店的顾客都会买一件物品。(当天所卖物品的数量 = min(顾客数量,当前物品数量))
第 i 天货物只能在第 i 天卖。
从第一天开始算。
问:身为老板的你,在这 n 天内最多可以卖出多少件物品?
数据范围:
1 ≤ n ≤ 105,
0 ≤ k ≤ n ,
0 ≤ ai , bi ≤ 109
Input
第一行输入 n , k,分别代表未来 n 天,可最多让 k 天的物品翻一倍。
接下来 n 行,第 i 行输入 ai , bi 。分别代表 第 i 天所拥有的货物数量 ai 以及 第 i 天要来你商店的顾客人数 bi。
Output
在这 n 天内最多可以卖出物品的数量
SampleInput 1
4 2
2 1
3 5
2 3
1 5
2 1
3 5
2 3
1 5
SampleOutput 1
10可以让 第2天 和 第4天 的物品数量翻一倍。所以物品数量为【2,6,2,2】。总共卖出 1 + 5 + 2 + 2 = 10 件物品。
SampleInput 2
4 1
0 2
0 3
3 5
0 6
0 2
0 3
3 5
0 6
SampleOutput 2
5
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
long long a[200010],b[200010],c[200010],h=0;
int comp(int a,int b)
{
return a>b;
}
int main()
{
int n,k,i,j=0;
scanf("%d %d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%d %d",&a[i],&b[i]);
if(a[i]!=0&&b[i]!=0)
{
if(a[i]-b[i]>=0)//人不够,物够不需加。
h+=b[i];
else
{
h+=a[i];
if(a[i]*2-b[i]>0)
{
c[j]=b[i]-a[i];
j++;
}
else
{
c[j]=a[i];
j++;
}
}
}
我的主页
}
sort(c,c+j,comp);
for(i=0;i<k;i++)
h+=c[i];
printf("%I64d\n",h);
return 0;
}
sort算法一般默认为从小到大,否则需要重新定义。sort排列数是开区间,比如你有3个数,你就得sore(a,a+4)