CodeForces - 1255D (模擬+構造+貪心)

題意

https://vjudge.net/problem/CodeForces-1255Dios

rxc的農場裏'R'表示有米,如今有K只雞,給這k只雞選一些格子,每一個雞能夠有多個格子(每一個雞至少吃一個米),可是每一個雞的格子必須連通。問吃到最多的米和最少的米的差最小是多少。c++

思路

若是農場一共有cnt個米,那麼最優的分配確定是差值爲1或0,即給每一個雞先分cnt/k個米,而後把多餘的分配給每一個雞。由於雞的格子必須是連通的,因此能夠考慮相似蛇形填數的方法,每找到cnt/k(多餘的相似)個米就換下一隻雞,這樣就能保證是連通並且差值最小了。spa

代碼寫的有點冗長,個人判斷退出的方法是判斷當前點的上下左右是否被填過(先把全部位置都賦值成填過,再把rxc的位置賦值爲未填過),若是都填過了,那麼就結束。.net

代碼

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=105;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
char g[N][N],ch,res[N][N];
int a,b,now,vis[N][N],r,c,k;
void gao(int i,int j)
{
    vis[i][j]=1;
    if(now<a+1&&b)
    {
        if(g[i][j]=='R')
            now++;
        res[i][j]=ch;
        if(now==a+1)
        {
            now=0,b--,k--;
            if(k<=0)
                return ;
            if(ch=='9')
                ch='A';
            else if(ch=='Z')
                ch='a';
            else ch++;
        }
    }
    else if(now<a&&b==0)
    {
        if(g[i][j]=='R')
            now++;
        res[i][j]=ch;
        if(now==a)
        {
            now=0;
            k--;
            if(k<=0)
                return ;
            if(ch=='9')
                ch='A';
            else if(ch=='Z')
                ch='a';
            else ch++;
        }
    }

}
int main()
{
    std::ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        memset(vis,-1,sizeof(vis));
        int cnt=0;
        cin>>r>>c>>k;
        for(int i=1; i<=r; i++)
            for(int j=1; j<=c; j++)
                vis[i][j]=0;
        for(int i=1; i<=r; i++)
        {
            cin>>g[i]+1;
            for(int j=1; j<=c; j++)
            {
                if(g[i][j]=='R')
                    cnt++;
            }
        }
        a=cnt/k,b=cnt%k,now=0;
        int L=1,R=c,U=2,D=r,i=1,j=1;
        ch='0';
        while(1)
        {
            int f=0;
            while(j<=R)
            {
                gao(i,j);
                j++;
                f=1;
            }
            if(f)
                j--;

            if(vis[i+1][j]&&vis[i-1][j]&&vis[i][j+1]&&vis[i][j-1])
                break;
            i++;
            //                cout<<"ggg:"<<i<<" "<<j<<endl;
            f=0;
            R--;
            while(i<=D)
            {
                gao(i,j);
                i++;
                f=1;
            }
            if(f)
                i--;

            if(vis[i+1][j]&&vis[i-1][j]&&vis[i][j+1]&&vis[i][j-1])
                break;
            j--;
            D--;
            //                   cout<<"gg:"<<i<<" "<<j<<endl;
            f=0;
            while(j>=L)
            {
                gao(i,j);
                j--;
                f=1;
            }
            if(f)
                j++;

            if(vis[i+1][j]&&vis[i-1][j]&&vis[i][j+1]&&vis[i][j-1])
                break;
            i--;
            L++;
            //                  cout<<"gg:"<<i<<" "<<j<<endl;
            f=0;
            while(i>=U)
            {
                gao(i,j);
                i--;
                f=1;
            }
            if(f)
                i++;

            if(vis[i+1][j]&&vis[i-1][j]&&vis[i][j+1]&&vis[i][j-1])
                break;
            j++;
            U++;
            //                  cout<<"gg:"<<i<<" "<<j<<endl;
        }
        for(int i=1; i<=r; i++)
        {
            for(int j=1; j<=c; j++)
            {
                cout<<res[i][j];
            }
            cout<<endl;
        }

    }
    return 0;
}
相關文章
相關標籤/搜索