【BZOJ1045】糖果传递(贪心)

题面

BZOJ

洛谷

题解

秉承者娱乐精神,我们必须写一个费用流,并且相信信仰跑不过去。

于是写了一个\(zkw\)费用流如下:(您可以无视此份代码)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 1000100
#define inf 1000000000
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,a[MAX];
struct Line{int v,next,w,fy;}e[8000010];
int h[MAX],cnt=2;
inline void Add(int u,int v,int w,int fy)
{
e[cnt]=(Line){v,h[u],w,fy};h[u]=cnt++;
e[cnt]=(Line){u,h[v],0,-fy};h[v]=cnt++;
}
bool vis[MAX];
int S,T;
ll dis[MAX];
bool SPFA(int S,int T)
{
for(int i=T;i<=S;++i)vis[i]=0,dis[i]=1e18;
queue<int> Q;Q.push(S);
dis[S]=0;vis[S]=true;
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=h[u];i;i=e[i].next)
{
if(!e[i^1].w)continue;
int v=e[i].v;
if(dis[v]>dis[u]-e[i].fy)
{
dis[v]=dis[u]-e[i].fy;
if(!vis[v])vis[v]=true,Q.push(v);
}
}
vis[u]=false;
}
if(dis[T]>=1e18)return false;
return true;
}
int dfs(int u,int flow)
{
if(u==T||!flow)return flow;
int ret=0;vis[u]=true;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;
if(!vis[v]&&e[i].w&&dis[v]==dis[u]-e[i].fy)
{
int d=dfs(v,min(flow,e[i].w));
e[i].w-=d;e[i^1].w+=d;flow-=d;ret+=d;
if(!flow)break;
}
}
return ret;
}
int main()
{
n=read();S=0;T=n+1;ll sum=0,ans=0;
for(int i=1;i<=n;++i)sum+=(a[i]=read());sum/=n;
for(int i=1;i<=n;++i)Add(S,i,a[i],0);
for(int i=1;i<=n;++i)Add(i,T,sum,0);
for(int i=1;i<n;++i)Add(i,i+1,inf,1),Add(i+1,i,inf,1);
Add(1,n,inf,1);Add(n,1,inf,1);
while(SPFA(T,S))ans+=1ll*dis[S]*dfs(S,inf);
printf("%lld\n",ans);
return 0;
}

似乎跑偏了。我们正常点。

我们设\(s[i]\)表示第\(i\)个点要给第\(i-1\)个点的糖果数,

答案\(ans=\sum |s[i]|\)

然后对于每个点,我们知道它最终的值,那么可以列出若干方程,

形如\(s[i+1]-s[i]+a[i]=averge\)

所以可以用\(s[1]\)来表示其他所有的值。

那么再套上绝对值,变成了找中位数的问题。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 1000100
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,a[MAX];
ll s[MAX];
int main()
{
n=read();ll sum=0,ans=0;
for(int i=1;i<=n;++i)sum+=(a[i]=read());sum/=n;
for(int i=1;i<=n;++i)s[i]=s[i-1]-a[i]+sum;
sort(&s[1],&s[n+1]);
for(int i=1;i<=n;++i)ans+=abs(s[i]-s[n/2]);
printf("%lld\n",ans);
return 0;
}

【BZOJ1045】糖果传递(贪心)的更多相关文章

  1. 【BZOJ1045】[HAOI2008] 糖果传递 贪心

    [BZOJ1045][HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正 ...

  2. 【数学】【HAOI2008】【BZOJ1045糖果传递】【BZOJ3293分金币】论数学的重要性

    BZOJ1045和BZOJ3293一模一样两道题,在这里我用1045来讲. 1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MB ...

  3. bzoj1045 糖果传递

    escription 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1 ...

  4. BZOJ-1045 糖果传递 数学+递推

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2975 Solved: 1327 [Submit][Sta ...

  5. bzoj 1045: [HAOI2008] 糖果传递 贪心

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1812  Solved: 846[Submit][Stat ...

  6. [BZOJ1045] [HAOI2008] 糖果传递 (贪心)

    Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=,表示小朋友的个数.接下来n行,每行 ...

  7. Luogu-P2512 [HAOI2008]糖果传递 贪心

    传送门:https://www.luogu.org/problemnew/show/P2512 题意: 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1 ...

  8. bzoj 1045 [HAOI2008] 糖果传递 —— 贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045 好像是贪心...但这是一个环... 看博客:http://hzwer.com/2656 ...

  9. 【BZOJ1045】[HAOI2008]糖果传递

    [BZOJ1045][HAOI2008]糖果传递 题面 bzoj 洛谷 题解 根据题意,我们可以很容易地知道最后每个人的糖果数\(ave\) 设第\(i\)个人给第\(i-1\)个人\(X_i\)个糖 ...

随机推荐

  1. Unity萌新日记—开发小技巧与冷知识(脚本篇)

    在学习unity的过程中,总会遇到很多零碎的知识点和小技巧,在此把它们记录下来,方便日后查看. 第一篇是关于脚本的一些你可能不知道的小知识. 还是个正在学习的萌新,如果写的不好,请谅解. Unity版 ...

  2. Java线程wait和sleep的区别

    Java中调用wait方法或者sleep方法都可以让线程进入waitint或者time-waiting状态,但是它们还是 有所不同的: wait是Object中的方法,而sleep则是Thread中的 ...

  3. POJ2251-Dungeon Master(3维BFS)

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

  4. Visual Studio的框选代码区块功能

    要从Visual Studio里复制代码粘贴到其他地方,会因为对齐的问题,造成粘贴的时候,代码左边带有大量的空格. 而VS有一个很好的功能就是框选功能,使用方法是,将光标放置在要框选代码的最左边,然后 ...

  5. Ubuntu下LimeSDR Mini使用说明

    本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 LimeSDR链接:https://item.taobao.com/item.htm?spm=a230r.1 ...

  6. Set up classpath in Eclipse

    On Eclipse main window Right click on .java file-> Run As -> Run Configurations... On Run Conf ...

  7. jenkins部署时遇到“似乎无法联网”,导致无法安装默认插件的解决方案

    jenkins安装更新时,默认会检查网络连接,而默认的checkulr 是http://www.google.com/ ,国内是无法访问的,所以修改成任意可以访问的地址即可,比如http://www. ...

  8. 团队冲刺——Four

    今日计划: 司宇航:网页生成桌面图标.如何将web项目上线部署到公网.测试与优化其他功能. 季方 :处理爬虫获取的数据. 马佳慧:研究css模板. 王金萱:登录注册界面. 遇到的问题:季方:爬虫获取的 ...

  9. BeanUtils解决日期问题

    ConvertUtils.register(new DateLocaleConverter(), Date.class); BeanUtils.populate(user, request.getPa ...

  10. C#和.net框架

    第一章C#和.net框架 c#只是.net的一部分,.net不只包含C#.C#是一种程序语言,.net是一个框架/平台 C#和.NET框架 在.NET之前 20世纪90年代,微软平台多数程序员使用VB ...