zoukankan      html  css  js  c++  java
  • Jzoj4722 跳楼机

    srwudi的跳楼机可以采用以下四种方式移动:
    1、向上移动x层;
    2、向上移动y层;
    3、向上移动z层;
    4、回到第一层。

    一个月黑风高的大中午,DJL来到了srwudi的家,现在他在srwudi家的第一层,碰巧跳楼机也在第一层。DJL想知道,他可以乘坐跳楼机前往的楼层数(不大于h)。

    我们发现变量只有3个,所以必然考虑层数%x的情况,若第i层可达,则必然第i+kx层也可以到达

    我们令d[i]表示最小的k满足k%x=i且存在自然数a,b使得k=ay+bz

    那么,显然d[1]=1,转移可以由d[(j+y)%x]=min(d[j]+y),d[(j+z)%x]=min(d[j]+z)

    这可以用一个dijk搞定

    最后答案就是∑max(0,(h-d[i])/x+1)

    #pragma GCC opitmize("O3")
    #pragma G++ opitmize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    struct dn{ int id,d; } c;
    int x,y,z; long long d[100010],S=0,h;
    inline bool operator< (dn a,dn b){ return a.d>b.d; }
    inline bool gmin(long long& x,long long y){ return x>y?(x=y):0; }
    priority_queue<dn> q;
    int main(){
    	memset(d,127,sizeof d);
    	scanf("%lld%d%d%d",&h,&x,&y,&z);
    	d[1%x]=0; q.push((dn){1%x,0}); --h;
    	for(int u;!q.empty();){
    		c=q.top(); q.pop();
    		if(c.d>d[u=c.id]) continue;
    		if(gmin(d[(u+y)%x],d[u]+y)) q.push((dn){(u+y)%x,d[u]+y});
    		if(gmin(d[(u+z)%x],d[u]+z)) q.push((dn){(u+z)%x,d[u]+z});
    	}
    	for(int i=0;i<x;++i) S+=(h<d[i]?0:(h-d[i])/x+1);
    	printf("%lld",S);
    }

  • 相关阅读:
    leetcode 131. Palindrome Partitioning
    leetcode 526. Beautiful Arrangement
    poj 1852 Ants
    leetcode 1219. Path with Maximum Gold
    leetcode 66. Plus One
    leetcode 43. Multiply Strings
    pytorch中torch.narrow()函数
    pytorch中的torch.repeat()函数与numpy.tile()
    leetcode 1051. Height Checker
    leetcode 561. Array Partition I
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477304.html
Copyright © 2011-2022 走看看