hdu 4671 Backup Plan

题意:有n个服务器,m个数据库,每个服务器可以给多个数据库服务,记录每个服务器服务的数据库的个数为ai ,|ai-aj|<=1

我是用贪心做的,只需考虑每个数据库的前两个服务器

具体过程看代码

 
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[120][120],b[120][120];//a[i][j]表示第i个数据库的第j个服务器,b[i][j]表示第i个数据库的第j个服务器时候被使用
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        if(n>=m)//如果n大于m 则每个服务器只给一个数据库服务,每个数据库 备用的服务器为第m+1个服务器即可
        {
            for(int i=1;i<=m;i++)
            {
                a[i][1]=i;
                b[i][i]=1;
                if(n>m)
                {
                    a[i][2]=m+1;
                b[i][m+1]=1;
                }
                else
                {
                    
                    a[i][2]=i+1;
                    if(i+1>m)//当n==m时 第一个服务器为最后一个数据库的备用服务器
                    {
                        a[i][2]=1;
                        b[i][1]=1;
                    }
                    else
                    b[i][i+1]=1;
                }
                
            }
           
        }
        else//当n<m时前m%n个服务器使用m/n+1次,其余服务器使用m/n次,备用服务器的原则是先使m/n次的服务器加1,然后其余服务器依次加1
        {
            int q;
            q=m/n;
            int w;
            w=m-n*q;
            q++;
            for(int i=1,f=1;i<=m;i=i+q,f++)
            {
                int k=w+1;
                for(int j=0;j<q;j++)
                {
                    if(f>w&&(j==q-1)) 
                    {
                        i--;
                        break;
                    }
                    a[i+j][1]=f;
                    b[i+j][f]=1;
                    if(k==(f)) k++;
                    if(k>n) k=k-n;
                    if(k==(f)) k++;
                    a[i+j][2]=k;
                    b[i+j][k]=1;
                    k++;
                }
            }
        } 
        for(int i=1;i<=m;i++)//分配其它的备用服务器
            {
                int k=1;
                for(int j=3;j<=n;j++)
                {
                    while(b[i][k]==1)
                    {
                        k++;
                    }
                    a[i][j]=k;
                    k++;
                    //cout<<a[i][j];
                    //k++;
                }
            }
        for(int i=1;i<=m;i++)
        {
            cout<<a[i][1];
            for(int j=2;j<=n;j++)
                cout<<" "<<a[i][j];
            cout<<endl;
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值