20201-7-14 「网络流 24 题」魔术球&负载平衡

「网络流 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=ji
我们直接:
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值