【BZOJ4582】【Usaco2016 open】Diamond Collector 贪心

来源:互联网 发布:mac etc目录 编辑:程序博客网 时间:2024/05/01 10:46

我必须承认做这题的主要目的是练习英文。。。

题目大意:给出n个大小不同的钻石和两个盒子,每个钻石可以放进某个盒子或者不放,但不能同时放入两个盒子,并且满足每个盒子中最大钻石和最小钻石的尺寸值不超过K,求两个盒子加起来最多一共可以放入多少颗钻石。

比较裸的排序后贪心,先由小到大排序,O(n)预处理出从i开始放最多可以放几颗到一个盒子,再找两个不相交的最大区间求和即可。

/**************************************************************
    Problem: 4582
    User: RicardoWang
    Language: C++
    Result: Accepted
    Time:68 ms
    Memory:1664 kb
****************************************************************/
 
#include<cstdlib>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
usingnamespacestd;
#define maxn 50015
intn,k,A[maxn],ans[maxn];
voidInit()
{
  scanf("%d%d",&n,&k);
  for(inti=1;i<=n;i++)scanf("%d",&A[i]);
  sort(A+1,A+1+n);
  return;
}
voidwork()
{
  intAns=0,j=1;
  for(inti=1;i<=n;i++)
  {
    while(A[j]-A[i]<=k && j<=n)j++;
    ans[i]=j-i;
  }
  for(inti=n;i>=1;i--)
  {
    Ans=max(Ans,ans[i]+ans[i+ans[i]]);
    ans[i]=max(ans[i],ans[i+1]);
  }
  printf("%d\n",Ans);
  return;
}
intmain()
{
  //freopen("in.txt","r",stdin);
  Init();
  work();
  return0;
}


0 0
原创粉丝点击