题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1084
题意:n个人,每个人站在x轴上某一点。每个人最多走K的长度。现在这些人要走成若干堆,每堆至少3个人。问最少可以走成多少堆?
思路:怎么也没想出来。。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define min(x,y) ((x)<(y)?(x):(y)) 6 using namespace std; 7 8 const int INF=1000000000; 9 int C,num=0; 10 int n,K,f[100005],a[100005]; 11 12 int DFS(int cur) 13 { 14 if(cur>=n) return 0; 15 if(f[cur]!=-1) return f[cur]; 16 int &ans=f[cur]; 17 int next=upper_bound(a,a+n,a[cur]+K)-a; 18 ans=INF; 19 if(next-cur>=3) ans=min(ans,1+DFS(next)); 20 if(next-cur>=4) ans=min(ans,1+DFS(next-1)); 21 if(next-cur>=5) ans=min(ans,1+DFS(next-2)); 22 return ans; 23 } 24 25 int main() 26 { 27 for(scanf("%d",&C);C--;) 28 { 29 scanf("%d%d",&n,&K); 30 K<<=1; 31 int i; 32 for(i=0;i<n;i++) scanf("%d",&a[i]); 33 sort(a,a+n); 34 memset(f,-1,sizeof(f)); 35 int ans=DFS(0); 36 if(ans==INF) ans=-1; 37 printf("Case %d: %d\n",++num,ans); 38 } 39 return 0; 40 }