【BZOJ4582】【Usaco2016 open】Diamond Collector 贪心

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

题目大意:给出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>
using namespace std;
#define maxn 50015
int n,k,A[maxn],ans[maxn];
void Init()
{
   scanf ( "%d%d" ,&n,&k);
   for ( int i=1;i<=n;i++) scanf ( "%d" ,&A[i]);
   sort(A+1,A+1+n);
   return ;
}
void work()
{
   int Ans=0,j=1;
   for ( int i=1;i<=n;i++)
   {
     while (A[j]-A[i]<=k && j<=n)j++;
     ans[i]=j-i;
   }
   for ( int i=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 ;
}
int main()
{
   //freopen("in.txt","r",stdin);
   Init();
   work();
   return 0;
}


你可能感兴趣的:(【BZOJ4582】【Usaco2016 open】Diamond Collector 贪心)