最近的题都不算难,只是都是因为自己在 一边 判断 上 不够清晰,导致 要么 忽略了某种情况 ,要么分类方法不科学,使程序非常复杂。。。。
以后一定要想清楚,把分支理好。。。没想清楚就下手。。最后改代码的过程真是太痛苦了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
struct qu
{
__int64 l,r;
} tm[200000+5];
__int64 nm[200000+5];
__int64 vis[200000+5];
__int64 cmp(qu a,qu b)
{
if (a.l!=b.l)
return a.l<b.l;
else
return a.r<b.r;
}
int main()
{
int i,j;
__int64 n,m,k;
scanf("%I64d%I64d%I64d",&n,&m,&k);
__int64 t;
scanf("%I64d",&t);
__int64 t1;
for (i=1;i<=n;i++)
{
scanf("%I64d",&t1);
tm[i].l=-t+t1;
tm[i].r=t1+t;
}
for (i=1;i<=m;i++)
scanf("%I64d",&nm[i]);
sort(tm+1,tm+1+n,cmp);
sort(nm+1,nm+1+m);
int cun=0;
int h=1;
for ( i=1;i<=n;i++)
{
while(nm[h]<tm[i].l&&h<=m) //墓已经不可以再选了 弃墓
h++;
for (;h<=m;h++)
{
if (vis[h]==k) //如果满人 弃墓
continue;
if (nm[h]>tm[i].r) //人已经不可以再选了 弃人
break;
if (nm[h]<=tm[i].r) //符合条件 cun++
{
cun++;
vis[h]++;
break;
}
}
}
cout<<cun<<endl;
return 0;
}