关于sort

 你是D商店的老板,最近你突然获得了两项超能力:
  1. 预知未来 n 天中 第 i 天所拥有的物品数量 ai 以及 第 i 天要来你商店的顾客人数 bi。

  2. 可以让最多 k 天的物品数量翻一倍。(每一天只能翻一次)


注意:

  • 每位来商店的顾客都会买一件物品。(当天所卖物品的数量 = min(顾客数量,当前物品数量))

  • 第 i 天货物只能在第 i 天卖。

  • 从第一天开始算。


问:身为老板的你,在这 n 天内最多可以卖出多少件物品?


数据范围:


1 ≤ n ≤ 105,

0 ≤ ≤ 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
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
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)
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页