我必須承認做這題的主要目的是練習英文。。。
題目大意:給出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; } |