zoukankan      html  css  js  c++  java
  • POJ 3189 Steady Cow Assignment

    题意:每个奶牛对所有的牛棚有个排名(根据喜欢程度排的),每个牛棚能够入住的牛的数量有个上限,重新给牛分配牛棚,使牛棚在牛心中的排名差(所有牛中最大排名和最小排名之差)最小。
     
    题目输入:
    首先是两个数字N , B代表有N只牛B个牛棚
    接下来的第一行B个数字代表每个牛棚最多能容纳多少牛。
    接下来N行每行B个数字代表牛心中牛棚的排名。
     
    我勒个去啊!真郁闷,WA了好多次终于AC发现自己错是因为重新构图后下标是从0开始的,改成下标从 1 开始的就AC了
     
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    #include<vector>
    #include<queue>
    #include<cmath>
    using namespace std;
    #define INF 0x3fffffff
    #define maxn 1255
    int n, m;///n 只牛  m个牛棚
    bool vis[maxn];
    int limt[maxn];///代表牛棚所能容纳的最大数量
    vector<vector<int> > G;
    vector<vector<int> > P;///用来保存匹配的数据
    
    bool Find(int u,int L,int R)
    {
        for(int i=L; i<=R; i++)///遍历u的前k条边
        {
            int v = G[u][i-1];
            if( !vis[v] )
            {
                vis[v] = true;
                if(P[v].size() < limt[v])
                {
                    P[v].push_back(u);
                    return true;
                }
                for(int j=0; j<P[v].size(); j++)
                {
                    if( Find(P[v][j], L, R) )
                    {
                        P[v].erase(P[v].begin()+j);
                        P[v].push_back(u);
                        return true;
                    }
                }
            }
        }
        return false;
    }
    
    bool solve(int L,int R)
    {
        P.clear();
        P.resize(m+10);
        for(int i=1; i<=n; i++)
        {
            memset(vis, false, sizeof(vis));
            if( !Find(i, L, R) )
                return false;
        }
        return true;
    }
    
    int main()
    {
        while(scanf("%d %d",&n, &m) != EOF)
        {
            G.clear();
            G.resize(n+10);
    
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=m; j++)
                {
                    int a;
                    scanf("%d", &a);
                    G[i].push_back(a);///保存每只牛心中的排名
                }
            }
            for(int i=1; i<=m; i++)
                scanf("%d", &limt[i]);
            int ans = INF;
            for(int i=1; i<=m; i++)///枚举一下。我们只允许选择前i个牛棚到j个牛棚
            {
                for(int j=i; j<=m; j++)
                {
                    if(j-i+1 > ans)
                        break;
                    if( solve(i, j) )
                        ans = j - i + 1;
                }
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    2018-10-20-WPF-通过位处理合并图片
    2019-2-11-WPF-获取应用的所有窗口
    2019-2-11-WPF-获取应用的所有窗口
    2018-8-10-WPF-如何在绑定失败异常
    2018-8-10-WPF-如何在绑定失败异常
    类和对象
    类和对象
    什么是可串行化MVCC
    LeetCode-环形链表|+环形链表||
    用js仿探探拖拽卡片的效果、飞卡片的效果,感觉挺酷,最后有美女看哦!
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4719911.html
Copyright © 2011-2022 走看看