「网络流 24 题」魔术球&负载平衡
写在前面:
这是今天的第二篇博客,告诉大家一个好消息:本人正在筹划一个超级计划,最近在学算法的Oler们,一定要收藏哦!
来!讲题!
魔术球:
题目大意:
假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,4,···的球。1.每次只能在某根柱子的最上面放球。
2.在同一根柱子中,任何2个相邻球的编号之和为完全平方数。试设计一个算法,计算出在n根柱子上最多能放多少个球。
正解:
这道题,说是网络流,其实是贪心,我们可以直接暴力for循环过掉,简单好操作,牛牛牛!
我们设
f
i
,
j
=
在
柱
子
j
上
放
为
i
球
f_{i,j}=在柱子j上放为i球
fi,j=在柱子j上放为i球
我们直接:
f
j
,
+
+
f
j
,
0
=
i
f_{j,++f_{j,0}}=i
fj,++fj,0=i
ok,我们来实现一下吧!
code:
#include<bits/stdc++.h>
using namespace std;
int flag=1,i,a[10000],f[100][10000],n;
int main()
{
scanf("%d",&n);
for(i=1;i<88;i++) a[i*i]=1;
i=0;
while(i!=-1)
{
i++;
for(int j=1;j<=n;j++)
{
if(a[f[j][f[j][0]]+i]==1||f[j][0]==0)
{
flag=0;
f[j][++f[j][0]]=i;
break;
}
}
if(flag==1)
{
printf("%d\n",i-1);
for(int j=1;j<=n;j++)
{
for(int k=1;k<f[j][0];k++) printf("%d ",f[j][k]);
printf("%d\n",f[j][f[j][0]]);
}
return 0;
}
flag=1;
}
return 0;
}
负载平衡:
科普小知识:
负载平衡是指服务器在运行多个任务时,运行不过来时,会分别使用多台服务器来运行这些任务。就像收银台阿姨忙不过来,要多叫几个人一起收一样。不过,多用一台服务器,就得多浪费一台服务器,因为运行时,服务器就会只运行这个任务,而且,一个账户很有可能在两个服务器中间“左右横跳”。因此,我们主流做法是些更好的算法来“压榨”服务器。不过,如果任务实在太多。。。(sorry,麻烦你了,二号服务器)
题目大意:
G公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最少搬运量可以使n个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。输出最少搬运量。
正解:
这这这。。。
我们又遇上了一道贪心!!!
我们这时应该想到,如果让他最优运送的话,那么最好就是在库存最平均的部分。因为最平均的部分,可运送的值就越小,那么,经过这种贪心思想,我们不难发现做法:前缀和!
ok,来!
code:
#include<bits/stdc++.h>
using namespace std;
long long s[101],b[101],a[101];
long long sum;
int main()
{
long long n,m=0;
scanf("%lld",&n);
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
m+=a[i];
}
m/=n;
for(int i=1; i<=n; i++)
{
b[i]=a[i]-m;
s[i]=s[i-1]+b[i];
}
sort(s+1,s+n+1);
long long u=s[n/2+n%2];
for(int i=1; i<=n; i++) sum+=abs(u-s[i]); //有可能有负数哦!因为有可能身体被掏空(啥玩意?明明是运过来!)
printf("%lld",sum);
return 0;
}