题解shoi2001化工厂装箱员

Twilight_Sx Twilight_Sx     2022-10-13     501

关键词:

————传送:洛谷P2530

这道题目还是挺简单的,状态也容易想到。

数据范围非常的小,所以即便是很多维度,复杂度也完全可以接受。定义状态:dp[i][a][b][c]为手上的货物拿到第i个时三种物品分别有a, b, c个所用的最少次数。

状态转移就暴力枚举是放下a,b,c中的哪一个。

只不过需要特判一下n<10的情况。//再一次对自己丑陋的代码有点接受无能……

#include <bits/stdc++.h>
using namespace std;
#define maxn 102
#define INF 999999
int n, ans = INF, suma[maxn], sumb[maxn], sumc[maxn], dp[maxn][11][11][11];
char c[maxn];

int min(int a, int b)
{
    if(b == -1) return a;
    if(a == -1) return b;
    return a < b ? a : b;
}

int trans(int x, int y, int aa, int bb, int cc)
{
    int a = suma[y] - suma[x], b = sumb[y] - sumb[x], c = sumc[y] - sumc[x];
    int sum = a + b + c + aa + bb + cc;
    bool done = false;
    if(sum - aa <= 10) done = true, dp[y][a][b + bb][c + cc] = min(dp[x][aa][bb][cc] + 1, dp[y][a][b + bb][c + cc]);
    if(sum - bb <= 10) done = true, dp[y][a + aa][b][c + cc] = min(dp[x][aa][bb][cc] + 1, dp[y][a + aa][b][c + cc]);
    if(sum - cc <= 10) done = true, dp[y][a + aa][b + bb][c] = min(dp[x][aa][bb][cc] + 1, dp[y][a + aa][b + bb][c]);
    if(!done) return -1;
    else return 0;
}

int main()
{
    scanf("%d
", &n);
    memset(dp, -1, sizeof(dp));
    for(int i = 1; i <= n; i ++)
    {
        cin >> c[i];
        suma[i] = suma[i - 1];
        sumb[i] = sumb[i - 1];
        sumc[i] = sumc[i - 1];
        if(c[i] == A) suma[i] ++;
        else if(c[i] == B) sumb[i] ++;
        else sumc[i] ++;
    }
    if(n < 10)//特判
    {
        ans = 0;
        if(suma[n]) ans ++;
        if(sumb[n]) ans ++;
        if(sumc[n]) ans ++;
        printf("%d
", ans);
        return 0;
    }
    dp[10][suma[10]][sumb[10]][sumc[10]] = 0;
    for(int i = 10; i <= n; i ++)
    {
        for(int aa = 0; aa <= 10; aa ++)
            for(int bb = 0; bb <= 10; bb ++)
                for(int cc = 0; cc <= 10; cc ++)
                {
                    if(dp[i][aa][bb][cc] == -1) continue;
                    for(int j = i + 1; j <= n; j ++)
                        if(trans(i, j, aa, bb, cc) == -1) break; 
                }
    }
    for(int aa = 0; aa <= 10; aa ++)
        for(int bb = 0; bb <= 10; bb ++)
            for(int cc = 0; cc <= 10; cc ++)
            {
                if(dp[n][aa][bb][cc] == -1) continue;
                int tem = 0;
                if(aa) tem ++;
                if(bb) tem ++;
                if(cc) tem ++;
                ans = min(ans, dp[n][aa][bb][cc] + tem);
            }
    printf("%d
", ans);
    return 0;
}

 

洛谷p2530[shoi2001]化工厂装箱员

题目描述118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱... 查看详情

p2530[shoi2001]化工厂装箱员(代码片段)

题目描述118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱... 查看详情

洛谷p2530化工场装箱员

...uogu.org/problem/show?pid=2530118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分... 查看详情

题解装箱问题(代码片段)

题目描述    一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1,2*2,3*3,4*4,5*5,6*6。这些产品通常使用一个6*6*h的长方体包裹包装然后邮寄给客户。因为邮... 查看详情

排序工作量之新任务(shoi2001)

排序工作量之新任务(SHOI2001)给出两个整数n和t,求n的全排列中逆序对数为t的个数,和逆序对数为t的字典序最小全排列。首先第一个问题可以用dp解决,\(f[i][j]\)表示前i个数,j个逆序对的序列数,那么\(f[i][j]=f[i-1][j-k]\(k<i)(k... 查看详情

luogup2526_[shoi2001]小狗散步_二分图匹配

luoguP2526_[SHOI2001]小狗散步_二分图匹配题意:Grant喜欢带着他的小狗Pandog散步。Grant以一定的速度沿着固定路线走,该路线可能自交。Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇。小狗和主人同时从(X1,Y1)点出发,... 查看详情

[luogup2526][shoi2001]小狗散步(二分图最大匹配)

传送门 简直就是模板题啊! #include<cmath>#include<cstdio>#include<cstring>#include<iostream>#defineN101usingnamespacestd;intn,m,cnt;intX1[N],Y1[N],X2[N],Y2[N],head[N],to[N*N],nex 查看详情

2001装箱问题

题目描述 Description有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。输入描述 InputDescripti... 查看详情

1014装箱问题code[vs]

...bsp;时间限制:1s 空间限制:128000KB 题目等级:黄金Gold题解 查看运行结果  题目描述 Description有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。要... 查看详情

noip2001装箱问题(codevs1014)

装箱问题题目描述   Description                   有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有 查看详情

[p2526][shoi2001]小狗散步(代码片段)

Link:P2526传送门Solution:一道提示非常到位的题目题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献于是明显可以将原题看作询问在两个不相交点集间最多能连几条边接下来将合法边连上跑二分图匹... 查看详情

题解-shoi2005树的双中心(代码片段)

SHOI2005树的双中心给树(T=(V,E)(|V|=n)),(w_u(uinV))。求(xinV,yinV:left(sum_uinVw_ucdotmin(dis_u,x,dis_u,y)ight)_min)。数据范围:(1lenle50000),(1leT‘s~Heightle100)。一眼思路:把(T)由一条边砍成(T 查看详情

洛谷p2527[shoi2001]panda的烦恼

题目描述panda是个数学怪人,他非常喜欢研究跟别人相反的事情。最近他正在研究筛法,众所周知,对一个范围内的整数,经过筛法处理以后,剩下的全部都是质数,不过panda对这些不感兴趣,他只对被筛掉的数感兴趣,他... 查看详情

p3830[shoi2012]随机树题解(代码片段)

P3830随机树坑题,别人的题解我看了一个下午没一个看得懂的,我还是太弱了。题目链接 P3830 [SHOI2012]随机树 题目描述输入输出格式输入格式: 输入仅有一行,包含两个正整数q,n,分别表示问题编号以及叶结点的... 查看详情

bzoj4869:[shoi2017]相逢是问候——题解

...new/show/P3747#sub 参考洛谷的前两篇(也是仅有的两篇)题解。首先我们要知道一个公式:这又被叫做扩展欧拉定理,证明我们并不关心。有了扩展欧拉定理,我们就能够避免高精度从而求出对于任意一个数的0操作 查看详情

bzoj4868:[shoi2017]期末考试——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=4868题目复制于洛谷:https://www.luogu.org/problemnew/show/P3745#sub有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布。第i位同学希望在第ti天或之前得知所有课程的... 查看详情

bzoj4870:[shoi2017]组合数问题——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=4870https://www.luogu.org/problemnew/show/P3746 看网上一群人说“傻逼题”,我感觉我傻逼了。首先我们把式子转换一下变成求有nk件物品,我取的物品数%k==r的方案数有多少。显然f[i][j]=f[i-1][j... 查看详情

bzoj1023:[shoi2008]仙人掌图——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=1023Description  如果某个无向连通图的任意一条边至多只出现在一条简单回路(simplecycle)里,我们就称这张图为仙人掌图(cactus)。所谓简单回路就是指在图上不重复经过任何一个顶点的回... 查看详情