zoukankan      html  css  js  c++  java
  • 洛谷 p2530 化工场装箱员(资源型)

    化工场装箱员

    https://www.luogu.org/problem/show?pid=2530

    118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯 度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱员grant第1次顺序从流水线上取10个成品(如果一 共不足10个,则全部取出),以后每一次把手中某种纯度的成品放进相应的箱子,然后再从流水线上顺序取一些成品,使手中保持10个成品(如果把剩下的全部 取出不足10个,则全部取出),如果所有的成品都装进了箱子,那么grant的任务就完成了。

    ��由于装箱是件非常累的事情,grant希望他能够以最少的装箱次数来完成他的任务,现在他请你编个程序帮助他。

    【输入格式】

    第1行为n(1<=n<=100),为成品的数量

    以后n行,每行为一个大写字母A,B或C,表示成品的纯度。

    【输出格式】

      仅一行,为grant需要的最少的装箱次数。

    【输入样例】worker.in

    11

    A

    B

    C

    A

    B

    C

    A

    B

    C

    A

    B

    【输出样例】worker.out

    3

    dfs TLE,得70,

    状态:装了s次,从流水线上取下了d个,手中有a个A产品,b个B产品,c个C产品深搜

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,x[101],f[101][101][101];
    int A,B,C,ans=100;
    char c;
    void dfs(int s,int d,int a,int b,int c)
    {
        if(d==n)
        {
            ans=min(ans,s+(a>0)+(b>0)+(c>0));
            return;
        }
        while(d<n)
        {
            if(a+b+c!=10)
            {
                ++d;
                switch(x[d])
                {
                    case 1:a++;break;
                    case 2:b++;break;
                    case 3:c++;break; 
                }
            }
            else break;
        }
        if(a) dfs(s+1,d,0,b,c);
        if(b) dfs(s+1,d,a,0,c);
        if(c) dfs(s+1,d,a,b,0);
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) 
        {
            cin>>c;
            if(c=='A') x[i]=1,A++;
            else if(c=='B') x[i]=2,B++;
            else x[i]=3,C++;
        }
        dfs(0,0,0,0,0);
        printf("%d",ans);
    }

    记忆化搜索  AC

    f[d][a][b][c]=s  表示的意义同上

    状态转移:f[d][a][b][c]=min(f[d][0][b][c],f[d][a][0][c],f[d][a][b][0])+1

    初始化:f数组赋为极大值

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,x[101],f[101][11][11][11];
    int A,B,C;
    char c;
    int dfs(int d,int a,int b,int c)
    {
        if(d==n)
        {
            f[d][a][b][c]=(a>0)+(b>0)+(c>0);
            return f[d][a][b][c];
        }
        while(d<n)
        {
            if(a+b+c!=10)
            {
                ++d;
                switch(x[d])
                {
                    case 1:a++;break;
                    case 2:b++;break;
                    case 3:c++;break; 
                }
            }
            else break;
        }
        if(f[d][a][b][c]<200) return f[d][a][b][c];
        if(a) f[d][a][b][c]=min(f[d][a][b][c],dfs(d,0,b,c)+1);
        if(b) f[d][a][b][c]=min(f[d][a][b][c],dfs(d,a,0,c)+1);
        if(c) f[d][a][b][c]=min(f[d][a][b][c],dfs(d,a,b,0)+1);
        return f[d][a][b][c];
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) 
        {
            cin>>c;
            if(c=='A') x[i]=1,A++;
            else if(c=='B') x[i]=2,B++;
            else x[i]=3,C++;
        }
        for(int l=0;l<=n;l++)
         for(int i=0;i<=10;i++)
          for(int j=0;j<=10;j++)
           for(int k=0;k<=10;k++)
           f[l][i][j][k]=200;
        printf("%d",dfs(0,0,0,0));
    }
  • 相关阅读:
    MySQL官方文档-二级索引覆盖主键索引
    windows server 2008/win7 远程控制
    博客园美化日记
    MarkDown 中使用 LaTeX 数学式
    DOS命令和bat脚本
    数据链路层
    网络安全
    运输层安全协议SSL
    DNS/域名
    停止等待协议
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6358818.html
Copyright © 2011-2022 走看看