QBXT2018 4 29 DP&图论班 胡策 by zhx

PS:由于长者是以我们没有学过图论与DP的基础上出的题,所以可能(?)会有点水。

题意:

T1:判断括号序列是是否合法。可以利用栈,别忘了判断最终栈是否为空。

#include<cstdio>
#include<cstdlib>
#include<cstring>

using namespace std;

char s[1000],z[1000];

int size;

int main()
{
    scanf("%s",s+1);
    int l=strlen(s+1);
    size++;
    z[size]=s[1];
    for (int a=2;a<=l;a++)
    {
        if (s[a]==‘)‘)
        {
            if (z[size]!=‘(‘)
            {
                printf("Wrong\n");
                return 0;
            }
            else size--;
        }
        if (s[a]==‘]‘)
        {
            if (z[size]!=‘[‘)
            {
                printf("Wrong\n");
                return 0;
            }
            else size--;
        }
        if (s[a]==‘}‘)
        {
            if (z[size]!=‘{‘)
            {
                printf("Wrong\n");
                return 0;
            }
            else size--;
        }
        if (s[a]==‘(‘ || s[a]==‘[‘ || s[a]==‘{‘)
        {
            size++;
            z[size]=s[a];
        }
    }
    if (size!=0) printf("Wrong\n");
    else printf("OK\n");

    return 0;
}

a-std by zhx

T2:0/1/2背包 可以将物品复制一份跑0/1背包板子,也可以变化转移方程

f[i][j]=max{f[i-1][j],f[i-1][j-w[i]]+v[i],f[i-1][j-2*w[i]]+2*v[i]}

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

using namespace std;

const int maxn=210;

int n,m,w[maxn],v[maxn],f[maxn][maxn];

int main()
{
    scanf("%d%d",&n,&m);
    for (int a=1;a<=n;a++)
        scanf("%d%d",&w[a],&v[a]);
    for (int a=0;a<n;a++)
        for (int b=0;b<=m;b++)
        {
            f[a+1][b]=max(f[a+1][b],f[a][b]);
            if (b+w[a+1]<=m) f[a+1][b+w[a+1]]=max(f[a+1][b+w[a+1]],f[a][b]+v[a+1]);
            if (b+2*w[a+1]<=m) f[a+1][b+2*w[a+1]]=max(f[a+1][b+2*w[a+1]],f[a][b]+2*v[a+1]);
        }
    int ans=0;
    for (int a=0;a<=m;a++)
       ans=max(ans,f[n][a]);
    printf("%d\n",ans);
    return 0;
}

b-std by zhx

T3:超神贪心

钟长者说:”这道题放在第二题下面,就是让你们把它当成背包做的。“。。。然后全场只有一位同学拿了10分,不愧为防AK好题 PS:好像这题一星期前还是最长上升子序列。。

此题具有特殊性质:每件物品都是1x2或1x3的,因此我们所选的物品就像俄罗斯方块一样放在一起。

SO此题可以抽象为选a个1x2的物品,b个1x3的物品。而我们可以贪心地将物品按价值从大到小拿取。

这里我们可以前缀和优化,预处理出前i件物品的价值和。其中s2[]代表1x2的价值前缀和,s3[]代表1x3的价值前缀和。

①枚举a,b 则答案ans为max{ans,s2[a]+s3[b]};

②可以只枚举b 然后根据b算出a

贪心地想,我们需要将剩余的空间尽可能用1x2的方格填满,因此所选择的1x2的方格的数量为a=min{n1,a=(n*m-3*b)/2}//n1为已知的1x2方格的数量 ,’/‘为整除(下取整)

证明:当我们填完枚举的1x3的方格时,会留下两个矩形。↓

当矩形1宽度为0时,a的数目取决于矩形2面积的奇偶性 即a=(n*m-3*b)/2

当矩形1宽度为1时,我们可以先用2格方格填充矩形2 而矩形2最多会被留出一个1x1个空间 然后再竖着用2格方格填满矩形1 因此a的数目也为(n*m-3*b)/2

当矩形1宽度为2时,我们可以用2格方格填满矩形1 而a的数目取决于矩形2面积的奇偶性 即a=(n*m-3*b)/2

③那么b的范围是什么呢?是min(n2,n*m/3) 吗?//n2为已知的1x3方格的数量

有特殊情况:当空间为1x2、2x1、2x2时,不能放1x3的方格,因此这些情况应当特判。

有同学可能会问,若矩形2形成了2x2的方格会有影响吗?比如5x5

我们可以这么摆

也可以这么摆

因此只需特判2x2、1x2、2x1的情况即可。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

using namespace std;

const int maxn=10010;

int n,m,n1,n2,y[maxn],z[maxn],sum[maxn];

bool cmp(int a,int b)
{
    return a>b;
}

int main()
{
    int t;
    scanf("%d",&t);
    for (;t--;)
    {
        scanf("%d%d%d%d",&n,&m,&n1,&n2);
        for (int a=1;a<=n1;a++)
            scanf("%d",&y[a]);
        for (int a=1;a<=n2;a++)
            scanf("%d",&z[a]);
        sort(y+1,y+n1+1,cmp);
        sort(z+1,z+n2+1,cmp);
        for (int a=1;a<=n1;a++)
            y[a]+=y[a-1];
        for (int a=1;a<=n2;a++)
            z[a]+=z[a-1];
        int delta;
        if (n%3==2 && m%3==2 && (n==2 || m==2)) delta=4;
        else delta=n*m%3;
        int ans=0,limit=min(n2,(n*m-delta)/3);
        for (int a=0;a<=limit;a++)
            ans=max(ans,z[a]+y[min(n1,(n*m-a*3)>>1)]);
        printf("%d\n",ans);
    }

    return 0;
}

c-std by zhx

T4:

考场上想出了正解,然而又想了个数据,是”不是最短路上的一条边连着一个速度很大的马“。然后就写了个BFS,拿了40。。。。

已知有Q次询问,每次询问从u到v的最短时间,再根据数据范围,可以判断此题需要用到Floyd。

易证相同速度时路程越短时间越少,因此可以先预处理出任意两点间的最短路。

然后判断有哪些最短路是可以不换马走完的,此时该路径的时间即为“路径长度/路径起点的马的速度“。

根据这些已经得到的时间,我们可以进一步得到需要换马的路所需的时间,从而得到任意两点间的最短时间。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

using namespace std;

const int maxn=110;

int n,q,e[maxn],s[maxn];

double dis[maxn][maxn],dist[maxn][maxn];

int main()
{
    int T=1;
    for (int t=1;t<=T;t++)
    {
        scanf("%d%d",&n,&q);
        for (int a=1;a<=n;a++)
            scanf("%d%d",&e[a],&s[a]);
        for (int a=1;a<=n;a++)
            for (int b=1;b<=n;b++)
            {
                scanf("%lf",&dis[a][b]);
                if (dis[a][b]<0) dis[a][b]=1e+20;
                if (a==b) dis[a][b]=0;
            }
        for (int a=1;a<=n;a++)
            for (int b=1;b<=n;b++)
                for (int c=1;c<=n;c++)
                    dis[b][c]=min(dis[b][c],dis[b][a]+dis[a][c]);
        for (int a=1;a<=n;a++)
            for (int b=1;b<=n;b++)
                dist[a][b]=1e+20;
        for (int a=1;a<=n;a++)
            dist[a][a]=0;
        for (int a=1;a<=n;a++)
            for (int b=1;b<=n;b++)
                if (dis[a][b]<=e[a]) dist[a][b]=dis[a][b]/s[a];
        for (int a=1;a<=n;a++)
            for (int b=1;b<=n;b++)
                for (int c=1;c<=n;c++)
                    dist[b][c]=min(dist[b][c],dist[b][a]+dist[a][c]);
        //printf("Case #%d:",t);
        for (int a=1;a<=q;a++)
        {
            int s,e;
            scanf("%d%d",&s,&e);
            printf("%.6lf\n",dist[s][e]);
        }
    }

    return 0;
}

d-std by zhx

原文地址:https://www.cnblogs.com/Loi-Brilliant/p/8972124.html

时间: 2024-10-06 07:50:04

QBXT2018 4 29 DP&图论班 胡策 by zhx的相关文章

QBXT 2018春季DP&amp;图论班 2018.5.3 --- 区间DP专题

本文题目等来自北京大学张浩威学长的PPT. 1.区间DP:解决有关两个或以上的区间的合并或删除的问题(最大/小次数/价值.方案总数.可行性等). 2.石子合并: 有n堆石子排成一排,第i堆石子的个数为ai.每次可以将相邻两堆合并成一堆.合并的代价为两堆石子的石子个数之和.设计方案要求代价之和最小. 状态:dp[l][r]表示只考虑区间l~r的石子,将它们合并的最小代价. 状态转移:dp[l][r]=min{dp[l][r],dp[l][k]+dp[k+1][r]+s[r]-s[l-1]} l~r

【2019.8.14】2019QB学堂DP图论班第一次考试 Problem C

Problem C Problem Description Tarzan 非常烦数轴因为数轴上的题总是难度非常大.不过他非常喜欢线段,因为有关线 段的题总是不难,讽刺的是在一个数轴上有 n 个线段,Tarzan 希望自己喜欢的东西和讨厌的 东西不在一起,所以他要把这些线段分多次带走,每一次带走一组,最多能带走 k 次.其实 就是要把这些线段分成至多 k 组,每次带走一组,问题远没有那么简单,tarzan 还希望每次 选择的线段组都很有相似性,我们定义一组线段的相似性是组内线段交集的长度,我们现在

【弱校胡策】2016.4.14 (bzoj2164)最短路+状压DP+矩阵乘法+高斯消元+树链剖分+线段树+背包DP

cyyz&qhyz&lwyz&gryz弱校胡策 命题人:cyyz ws_fqk T3暴力写挫了 50+10+0滚粗辣! 奇妙的约会(appointment.cpp/c/pas) [问题描述] DQS和sxb在网上结识后成为了非常好的朋友,并且都有着惊人 的OI水平.在NOI2333的比赛中,两人均拿到了金牌,并保送进入 HU/PKU.于是两人决定在这喜大普奔的时刻进行面基. NOI2333参赛选手众多,所以安排了n个考点,DQS在1号考点, 而sxb在n号考点.由于是举办全国性赛事

弱省胡策系列简要题解

现在不是非常爽,感觉智商掉没了,就整理一下最近弱省胡策的题目吧. 其实题目质量还是很高的. 如果实在看不懂官方题解,说不定这里bb的能给您一些帮助呢? [弱省胡策]Round #0 A 20%数据,O(n4)傻逼dp. 40%数据,O(n3)傻逼dp. 100%数据,令f(x1,y1,x2,y2)表示从(x1,y1)走到(x2,y2)的路径条数.于是所有路径就是f(1,2,n?1,m)×f(2,1,n,m?1).然而两条路径可能在中间的某个点相交,我们找出最早的交点,并在这个交点互换两条路径的后

校内胡策(唯一一个想出来的)

2 第一题 (third.cpp/c/pas) 题目描述 小 R 最近沉迷于一个叫做 Slay.one 的游戏. 在这个游戏中,每一局有若干人参加,最终会产生一个优胜者.优胜者会获得 一个成就点. 现在小 R 已经利用某种手段得知了每场游戏有哪些人参加.假设所有人最初成 就点都是 0 ,小 R 想要知道所有游戏结束之后成就点最多的人至少有多少成就点. 校内胡策(唯一一个想出来的) 原文地址:https://www.cnblogs.com/Lance1ot/p/9445468.html

DP&amp;图论 DAY 3 上午

DP&图论  DAY 3  上午 状态压缩dp >状态压缩dp ?状态压缩是设计dp状态的一种方式.?当普通的dp状态维数很多(或者说维数与输入数据有关),但每一维总量很少是,可以将多维状态压缩为一维来记录.?这种题目最明显的特征就是: 都存在某一给定信息的范围非常小(在20以内),而我们在dp中所谓压缩的就是这一信息.?(或者是在做题过程中分析出了某一信息种类数很少)?我们来看个例子. >经典题?给出一个n*m的棋盘,要放上一些棋子,要求不能有任意两个棋子相邻.求方案数.? n<

DP&amp;图论 DAY 4 下午图论

DP&图论  DAY 4  下午 后天考试不考二分图,双联通 考拓扑排序 图论 图的基本模型 边: 有向边构成有向图 无向边构成无向图 权值: 1.无权 2.点权 3.边权 4.负权(dij不可以跑) 环: 1. 2.重边 3.有向无环图DAG 路径: 1.简单路径:不经过重复的点  1-->2-->3 不简单路径:经过重复点  1-->2-->3-->1-->4 2.连通,具有传递性 图: 1.树:n个点,n-1条边的无环连通图 2.完全图:一个无向图,图中任

DP&amp;图论 DAY 5 下午

DP&图论  DAY 5  下午 树链剖分  每一条边要么属于重链要么轻边 证明: https://www.cnblogs.com/sagitta/p/5660749.html 轻边重链都是交替走的(此处重链可以走若干条边) 1.dfs1 统计子树大小,确定重儿子 2.dfs2 找重链       重链,子树,分别是连续的一段 每个结点属于一个重链 ta < tb a 跳到 ta 的父节点 logn 级别 将树序列化 SPOJ QTREE Query on a tree Solution 树

DP&amp;图论 DAY 6 下午 考试

DP&图论  DAY 6  下午  考试 3 5 10 3 1 3 437 1 2 282 1 5 328 1 2 519 1 2 990 2 3 837 2 4 267 2 3 502 3 5 613 4 5 132 1 3 4 10 13 4 1 6 484 1 3 342 2 3 695 2 3 791 2 8 974 3 9 526 4 9 584 4 7 550 5 9 914 6 7 444 6 8 779 6 10 350 8 8 394 9 10 3 7 10 9 4 1 2 3