南京 I. Cloud Retainer's Game 题解(思维)

题目链接

题目思路

原先说这个对标铜银题,感觉不太像啊

我现在都有点理解不了,我感觉有点像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;
}
posted @ 2022-01-19 17:04  hunxuewangzi  阅读(297)  评论(0编辑  收藏  举报