codeforces-gym-100187-F【貪心】
Doomsday comes in t units of time. In anticipation of such a significant event n people prepared m vaults in which, as they think, it will be possible to survive. But each vault can accommodate only k people and each person can pass only one unit of distance per one unit of time. Fortunately, all people and vaults are now on the straight line, so there is no confusion and calculations should be simple.
You are given the positions of the people and the vaults on the line. You are to find the maximal number of people who can hide in vaults and think they will survive.
InputThe first line contains four integers n, m, k and t (1 ≤ n, m, k ≤ 200000, 1 ≤ t ≤ 109) separated by spaces — the number of people, the number of vaults, the capacity of one vault and the time left to the Doomsday.
The second line contains n integers separated by spaces — the coordinates of the people on the line.
The third line contains m integers separated by spaces — the coordinates of the vaults on the line.
All the coordinates are between - 109 and 109, inclusively.
OutputOutput one integer — the maximal number of people who can hide in vaults and think they will survive.
2 2 1 5 45 55 40 60output
2input
2 2 1 5 45 54 40 60output
1input
2 2 2 5 45 35 40 60output
2input
3 3 1 5 40 45 45 45 50 50output
3
大意:世界末日在 t 秒後要來了,n 個人,m 個避難所,一個避難所最多容納 k 個人,每個人一秒只能走 1 米,給出所有人,所有避難所的位置(都位於同一直線上),問最後最多幾個人可以活下來。
思路:就是貪心,一直掛在 test11 上,後來改了才過。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k,t;
int a[200010],b[200010];
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&k,&t))
{
for(int i=0;i<n;i++)
scanf("%d",a+i);
for(int i=0;i<m;i++)
scanf("%d",b+i);
sort(a,a+n);
sort(b,b+m);
int ans=0,j=0;
for(int i=0;i<m;i++)
{
int v=k;
while(j<n&&a[j]-t<=b[i]&&v) // 這裡注意一下,只要人往左走最大能走到避難所的左邊,且此時避難所有空位置,那麼不管這個人能不能進去,都去換下一個人上
{
if(a[j]+t>=b[i])
{
ans++;
v--;
}
j++;
}
if(j==n) break;
}
printf("%d\n",ans);
}
return 0;
}