zoukankan      html  css  js  c++  java
  • P2761 软件补丁问题

    P2761 软件补丁问题

    每种错误只有有与没有两种情况

    错误数只有二十

    我们就可以二进制压缩一下状态

    而且对于错误情况相同的情况,只要遍历到了一次,那么这种情况的最优解就已经出粗来了

    但是

    题目中是有可能有环的

    bfs就可以了

    利用二进制储存一下状态

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int b1[102],b2[102],f1[101],f2[102];
    int cost[102];
    char in[102];
    queue<int>q;
    bool inque[1048577];
    int dis[1048577];
    int main()
    {
        cin.sync_with_stdio(false);
        int n,m;
        cin>>n>>m;
        /*if(n==0)
        {
            //printf("0");
            cout<<"0";
            return 0;
        }*/
        int base,len;
        for(int i=1;i<=m;i++)	
        {
            cin>>cost[i];
            base=1;
            cin>>in;
            for(int j=0;in[j]!='';j++)
            {
                switch(in[j])
                {
                    case '+':b1[i]+=base;break;
                    case '-':b2[i]+=base;break;
                    case '0':break;
                }
                base*=2;
            }
            base=1;
            cin>>in;
            for(int j=0;in[j]!='';j++)
            {
                switch(in[j])
                {
                    case '-':f1[i]+=base;break;//二进制储存一下状态了,(#^.^#)
                    case '+':f2[i]+=base;break;
                    case '0':break;
                }
                base*=2;
            }		
        }
        base=1;
        int begin=0;
        for(int i=1;i<=n;i++)
        {
            begin+=base;
            base*=2;
        }
        for(int i=0;i<=begin;i++)
            dis[i]=0x7ffffff;
        q.push(begin);
        dis[begin]=0;
        inque[begin]=true;
        int pass,nxt;
        while(!q.empty())//bfs
        {
            pass=q.front();
            q.pop();
            inque[pass]=false;
            for(int i=1;i<=m;i++)
            {
                if((pass&b1[i])!=b1[i])//按照题目模拟
                    continue;
                if((pass&b2[i])!=0)
                    continue;
                int ha=pass&f1[i];//水水地打补丁
                nxt=pass-ha;
                nxt=nxt|f2[i];//再讲f2打上去
                if(dis[nxt]<dis[pass]+cost[i])
                    continue;
                dis[nxt]=dis[pass]+cost[i];
                q.push(nxt);
                if(!inque[nxt])
                    inque[nxt]=true;
            }
        }
        //printf("%d",dis[0]);
        cout << (dis[0] ==0x7ffffff?0:dis[0])<<endl;//我没有读题导致一直90分
    }
    
  • 相关阅读:
    605. Can Place Flowers
    1184. Distance Between Bus Stops
    1711. Count Good Meals
    1710. Maximum Units on a Truck
    566. Reshape the Matrix
    980. Unique Paths III
    212. Word Search II
    每日总结
    每日总结
    每日总结
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/8693187.html
Copyright © 2011-2022 走看看