• 南京 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;
    }
    
  • 相关阅读:
    msp430入门学习30
    msp430入门学习03
    msp430入门学习27
    msp430入门学习26
    msp430入门学习25
    msp430入门学习24
    msp430入门学习23
    msp430入门学习22
    去掉xcode中警告的一些经验
    CocoaPods详解之----使用篇
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/15823154.html
Copyright © 2020-2023  润新知