BZOJ 4828 DP+BFS

被一道简单BFS坑了这么长时间我也是hhh了

//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
struct Node{int d,x,l;Node(int D=0,int X=0,int L=0):d(D),x(X),l(L){}};
int n,m,mc,xx,a[105],w[105],maxx,f[105][105],top;
set<int>s[105];pair<int,int>p[10000000];
void BFS(){
    queue<Node>q;q.push(Node(1,1,0));
    while(!q.empty()){
        Node t=q.front();q.pop();
        if(t.d<maxx){
            q.push(Node(t.d+1,t.x,t.l+1));
            if(t.l>1&&t.x<=100000000/t.l&&s[t.l].find(t.x*t.l)==s[t.l].end())
                p[++top]=make_pair(t.x*t.l,t.d+1),
                s[t.l].insert(t.x*t.l),
                q.push(Node(t.d+1,t.x*t.l,t.l));
        }
    }
}
int main(){
    memset(f,0xcf,sizeof(f));
    scanf("%d%d%d",&n,&m,&mc),f[0][mc]=0;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)scanf("%d",&w[i]);
    for(int i=0;i<n;i++)
        for(int j=0;j<=mc;j++){
            if(j-a[i+1]>=0)
                f[i+1][j-a[i+1]]=max(f[i+1][j-a[i+1]],f[i][j]+1),
                f[i+1][min(mc,j-a[i+1]+w[i+1])]=max(f[i+1][min(mc,j-a[i+1]+w[i+1])],f[i][j]);
            maxx=max(maxx,f[i][j]);
        }
    BFS(),sort(p+1,p+1+top);
    for(int i=1;i<=m;i++){
        scanf("%d",&xx);
        int mn=0x3f3f3f3f;
        if(xx<=maxx){puts("1");goto ed2;}
        for(int j=top,k=0;j;--j)
        {
            while(k<top&&p[k+1].first+p[j].first<=xx) ++k,mn=min(mn,p[k].second-p[k].first);
            if(mn+p[j].second-p[j].first+xx<=maxx){puts("1");goto ed2;}
            if(p[j].first<=xx&&p[j].second+xx-p[j].first<=maxx){puts("1");goto ed2;}
        }
        puts("0");
        ed2:;
    }
}
时间: 2024-10-13 13:12:16

BZOJ 4828 DP+BFS的相关文章

bzoj 1791 DP

首先对于一棵树我们可以tree_dp来解决这个问题,那么对于环上每个点为根的树我们可以求出这个树的一端为根的最长链,并且在tree_dp的过程中更新答案.那么我们对于环,从某个点断开,破环为链,然后再用DP来解决这个问题. 备注:很久之前的一道题,刚转的c++,然后T了,也懒得改了. /************************************************************** Problem: 1791 User: BLADEVIL Language: C++

hdu 3247 AC自动+状压dp+bfs处理

Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others)Total Submission(s): 2382    Accepted Submission(s): 750 Problem Description Great! Your new software is almost finished! The only thing left to

bzoj 1222 DP

用w[i]表示在A中用了i的时间时在B中最少用多长时间,然后转移就可以了. 备注:这个边界不好定义,所以可以每次用一个cur来存储最优值,然后对w[i]赋值就可以了. /************************************************************** Problem: 1222 User: BLADEVIL Language: C++ Result: Accepted Time:2648 ms Memory:992 kb ***************

bzoj 3622 DP + 容斥

LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[i]大于b的组数. 不妨从整体去考虑,使用$f[n][j]$代表前n个中有j组$a[i]>b[i]$,很容易得到转移式$f[n][j]=f[n-1][j]+f[n-1][j-1]*(cnt[n]-(j-1))$,其中$cnt[i]$为比a[i]小的b[]个数 但是仔细思考该式子含义会发现,$f[n][j

BZOJ 1054题解 BFS暴力求解

BZOJ 1054题解 BFS暴力求解 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1884  Solved: 1033[Submit][Status][Discuss] Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移 动到某人

HDU-4771 Stealing Harry Potter&#39;s Precious 状压DP+BFS

哈利波特假期回姨夫家的时候会把他的宝贝藏在地精银行,现在要偷他的宝贝,银行的房间分为可破坏与不可破坏两种,其实就是可到达与不可到达,然后给出哈利的k个宝贝放的位置,如果能全部拿到输出最小的步数,不能拿到则输出-1,用BFS搜索,最先搜到的肯定就是步数最小的,搜不到则输出-1.最近做的好多DP题都跟搜索有关系,看来还是多方面都得会才行啊. #include <iostream> #include <cstdio> #include <cmath> #include <

HDU--4784 Dinner Coming Soon DP+BFS

题意很长很变态.一个人要到他男朋友家,他最初有R元以及T分钟的时间来赶到他男朋友家.有N个房子M条道路,每条道路有需要消耗的时间以及过路费,同时还要顺路做食盐生意,起初身上没有食盐,最多带B袋盐,每到达一个地方有三种操作可以选择:1.售出一袋食盐:2:购买一袋食盐:3:什么都不做.然后你以为结束了?不!它还存在平行宇宙,在一个城市可以选择穿越平行宇宙到达另一个宇宙的这个城市,不同宇宙的食盐价格不同但是过路费和道路需要的时间是相同的,而且由于他是穿越党,他不能在别的宇宙回到自己家或者男朋友家,求最

# codeforces 1272 F. Two Bracket Sequences(三维dp + bfs)

codeforces 1272 F. Two Bracket Sequences(三维dp + bfs) 题目大意 输入两个括号序列 s,t(不一定合法),你需要构造一个尽可能短的合法括号序列使得s,t 都是这个序列的子序列(子序列意味着不用连续) 解题思路 dp[i][j][k]表示匹配到s的第i个字符,匹配到t的第j个字符,并且此时(的个数比)多k个的时候的最小合法序列长度,k的上限是200(s和t中最多200个(或者)). 状态转移: 枚举答案合法序列的每一位是放置(或者) ? 放置(,如

bzoj 1415: [Noi2005]聪聪和可可【期望dp+bfs】

因为边权为1所以a直接bfs瞎搞就行--我一开始竟然写了个spfa #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; const int N=1005,inf=1e9; int n,m,st,ed,h[N],cnt,a[N][N],b[N][N],dis[N][N],d[N]; double f[N][N]; bool v[N]