题意:有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;
}
}
}