题目链接
题目思路
原先说这个对标铜银题,感觉不太像啊
我现在都有点理解不了,我感觉有点像dp一样有点玄乎,感觉类似于按照x轴,从右往左进行dp
所以我代码直接copy别人的了
官方题解如下
假设不存在挡板,那么小球的移动路线中,向右下移动的部分满足 ,向右上移动的部分满足 。
记 表示特征值为 的线路的最优答案。碰到金币 时, 和 均增加 ;碰到挡板 时,由于可以移除挡板, 和 均取二者中的最大值。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll h,x,y;
int t,n,m;
struct N {
bool f;
ll x,y;
} p[200010];
map<ll,int> mp;
bool cmp(struct N a,struct N b)
{
if (a.x!=b.x) return a.x>b.x;
else return a.y>b.y;
}
int main()
{
scanf("%d",&t);
while (t--) {
mp.clear();
scanf("%lld",&h);
scanf("%d",&n);
for (int i=1;i<=n;i++) {
scanf("%lld%lld",&x,&y);
p[i]={0,x,y};
}
scanf("%d",&m);
for (int i=1;i<=m;i++) {
scanf("%lld%lld",&x,&y);
p[n+i]={1,x,y};
}
sort(p+1,p+n+m+1,cmp);
for (int i=1;i<=n+m;i++) {
if (p[i].f) {
mp[(p[i].x+p[i].y)%(2*h)]++;
mp[(2*h-p[i].y+p[i].x)%(2*h)]++;
}
else {
int mx=max(mp[(p[i].x+p[i].y)%(2*h)],mp[(2*h-p[i].y+p[i].x)%(2*h)]);
mp[(p[i].x+p[i].y)%(2*h)]=mx;
mp[(2*h-p[i].y+p[i].x)%(2*h)]=mx;
}
}
cout<<mp[0]<<endl;
}
return 0;
}