zoukankan      html  css  js  c++  java
  • 【JZOJ3318】Brunhilda的生日

    description

    除去对铁质盔甲强烈的热爱,Brunhilda是一个正常的7岁女孩。近期,她正在策划一个完美的生日派对。她发明了如下的一个游戏:所有的孩子在一个数k被宣读之前不停地跑来跑去。当这个数字k宣读后,所有的孩子将形成人数恰好为k的若干群体,且保证剩余的孩子数目小于k。最后,这不足k个的孩子将从游戏中被淘汰。紧接着,比赛将继续进行,并公布一个新的数字k。游戏将在所有的孩子都被淘汰后结束。

    Brunhilda请她的父亲Wotan在游戏中来宣读数字。Wotan不喜欢这个游戏,当然也不希望在游戏的第一轮就宣布一个正无穷(PS:宣布正无穷等于将所有的孩子都从游戏中淘汰)。 Brunhilda认为这在派对上是相当尴尬的情形,所以她给了她父亲一串共计m个素数的列表。这样,她的父亲便可以从中进行选择。当然,相同的数字在游戏中可以被多次宣读。

    Wotan想尽快结束比赛,因为他有一张他最喜欢的足球俱乐部 FC Asgard的比赛门票。不幸的是,Brunhilda不知道派对上参加游戏的孩子数目。现在,对于Q个不同的数n1,...,nQ个儿童,Wotan要预先知道他所需宣读的最少数字,以便他尽早结束游戏。


    analysis

    • (DP)?暴力?

    • (f[i])表示从后往前推(i)的最小步数

    • 那么对于(i)的某个质因子(p)(f[i])可转移到(f[i+1..i+p-1])

    • 暴力搞出每个数存在的最大质因子

    • 可以知道(f)单调不递减,于是(f)肯定是一段一段的数且相差(1)

    • 记录一下当前转移的左段点,枚举转移到可转移的右端点暴力转移

    • 每种情况只可能被一个数转移得到,那么均摊(O(n))

    • 一道傻逼题调的我自闭


    code

    #pragma GCC optimize("O3")
    #pragma G++ optimize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define MAXN 100005
    #define MAX 10000000
    #define INF 1000000007
    #define ll long long
    #define fo(i,a,b) for (ll i=a;i<=b;++i)
    #define fd(i,a,b) for (ll i=a;i>=b;--i)
    
    using namespace std;
    
    ll maxp[MAX+5];
    ll f[MAX+5],p[MAXN],ask[MAXN];
    ll n,q,mx,left;
    
    inline ll read()
    {
    	ll x=0,f=1;char ch=getchar();
    	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    	return x*f;
    }
    inline ll min(ll x,ll y){return x<y?x:y;}
    int main()
    {
    	n=read(),q=read();
    	fo(i,1,n)p[i]=read(),maxp[p[i]]=p[i];
    	fo(i,1,q)mx=max(mx,ask[i]=read());
    	fo(i,1,n)for (ll j=p[i];j<=mx;j+=p[i])maxp[j]=p[i];
    	memset(f,64,sizeof(f));
    	fo(i,1,p[n]-1)f[i]=1;
    	fo(i,1,mx)
    	{
    		if (maxp[i] && f[i]<INF)
    		{
    			fo(j,max(left,i+1),min(i+maxp[i]-1,mx))f[j]=min(f[j],f[i]+1);
    		}
    		left=max(left,i+maxp[i]-1);
    	}
    	fo(i,1,q)if (f[ask[i]]>INF)printf("oo
    ");
    		else printf("%lld
    ",f[ask[i]]);
    	return 0;
    }
    
  • 相关阅读:
    HttpServletRequest对象,自己学习的心得。
    @PathVariable注解的使用和@Requestparam
    微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
    (转)ubuntu 14.04下安装hadoop2.6(伪分布式)
    数据库范式
    C与Python变量的区别
    python3获取当前目录(转)
    最大连续子数组积的线性解法
    最大子数组的线性解法
    windows7下python3.4.3 添加库路径(转)
  • 原文地址:https://www.cnblogs.com/horizonwd/p/11153826.html
Copyright © 2011-2022 走看看