【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>
usingnamespace std;
#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;
}


發佈了61 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章