P6170 [USACO16FEB] Circular Barn G

2024-04-12 21:44
文章标签 barn circular p6170 usaco16feb

本文主要是介绍P6170 [USACO16FEB] Circular Barn G,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目 [ 传送门 ]

        题目描述

        作为当代建筑的爱好者,Farmer John 建造了一个圆形新谷仓,谷仓内部 n个房间排成环形\left ( 3\leq n\leq 10^{5}\right ),按顺时针顺序编号为1...n,每个房间都有通往与其相邻的左右房间的门,还有一扇门通往外面。

        现在 FJ 有 n 头奶牛,他的目标是让每个房间恰好有一头奶牛。然而不幸的是,现在奶牛们随意呆在某个房间里,第 i 个房间里有 ci​ 头奶牛。保证 \sum ci=n

        FJ 决定采用这样的方法来解决这个问题:让某些奶牛顺时针穿过某些房间到达指定的位置。如果一头奶牛穿过了 d 扇门,他消耗的能量为 d^{2}。你需要帮 FJ 算出所有奶牛消耗的能量和最小值是多少。

        输入格式

        第一行一个整数 n,接下来 n行,第 i行一个整数 ci​。

        输出格式 

        输出所有奶牛最小消耗能量和。

分析

        有一个比较明显的贪心,设a,b,c为3个位置,a<b<c,那么a->b,b->c一定比a->c优,

简单的证明一下:

                设a,b间距离为x,  b,c间距离为y

                则a->b,b->c 的ans1=x^2+y^2 ,a->c的ans2=(x+y)^2

                显然,ans1<ans2

        那么,我们只需要确定了起点,就可以直接计算答案。

        于是,现在的问题就在于怎么求起点(起点的定义为以该点出发,最后在不回到该点的情况下,可以完成交换)。 不难发现,起点的ai一定为0(感性理解一下),并且任意一个点到起点的总个数应该小于等于当前已经经过的位置数(否则多余的牛一定会对起点前的位置产生影响)。通过这2点就可以找到起点。 于是:

Code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,s,id,ans,a[100005],b[100005],c[100005],t,l;
int main()
{scanf("%lld",&n); id=n;for(int i=1;i<=n;i++) scanf("%lld",a+i);for(int i=n;i>=1;i--){s+=a[i]; if(s>(id-i)) id=i-1,s=0;if(a[id]!=0 && a[i]==0) id=i;}while(a[id]!=0) id--;//找起点for(int i=id;i>=1;i--) b[++t]=a[i];for(int i=n;i>id;i--) b[++t]=a[i]; t=0;//把起点作为第一位,重构数组for(int i=1;i<=n;i++){if(b[i]==0) c[++t]=i;//c[]数组表示没有牛的位置else{int cnt=0;for(int j=1;j<=b[i] && l<t;j++) l++,ans+=(i-c[l])*(i-c[l]),cnt++;if(cnt==b[i]) c[++t]=i;//每次都走到第一个位置一定最优}}cout<<ans;return 0;
}

这篇关于P6170 [USACO16FEB] Circular Barn G的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898316

相关文章

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

python circular import python循环导入问题

遇到的问题是因为模块之间存在循环导入(circular import),导致了ImportError。循环导入是指两个或多个模块相互导入对方,如模块A导入了模块B的方法,模块B又导入了模块A的方法,从而导致其中一个模块在完全初始化之前就被另一个模块尝试导入,进而引发错误。 解决循环导入问题的方法 重构代码结构: 尽量避免模块之间的直接相互导入。可以考虑将公共的部分抽象出来,放到单独的模块中。

codeforces #52 C Circular RMQ(线段树)

题目地址:http://codeforces.com/problemset/problem/52/C 线段树区间更新水题。 代码如下: #include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctyp

Circular dependencies cannot exist in RelativeLayout错误解决

   在android应用程序中保存一下错误:   11-16 13:07:38.560: ERROR/AndroidRuntime(13277): java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout 11-16 13:07:38.560: ERROR/Andr

Hive ,At least 1 group must only depend on input columns. Also check for circular dependencies.

使用rank()排序报错: 2019-04-28 09:35:08,100 FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular depend

Circular RMQ

You are given circular array a0, a1, ..., an - 1. There are two types of operations with it: inc(lf, rg, v) — this operation increases each element on the segment [lf, rg] (inclusively) by v;rmq(lf,

Spring Security集成Spring Session并存储session到Redis中,报错: Circular reference involving containing bean

详细错误: Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sessionRepositoryFilterRegistration' defined in class path resource [org/springframew

Barn Repair

Barn Repair Description 在一个夜黑风高、下着暴风雨的夜晚,farmer John的牛棚的屋顶、门都被吹飞了。所幸,许多牛都在度假,所以牛棚并没有住满。 牛棚一个挨着一个相邻排列成一行,牛就在里面过夜。一些牛棚里面有牛,而一些没有。所有的牛棚都有相同的宽度。 自从门被吹走后,farmer John必须尽快地在牛棚前建立新的木板。他的新木料供应商将会供应给他任意他想要长度的

Error:Cannot build artifact ‘ssm:war exploded‘ because it is included into a circular dependency

Idea的maven项目在bulid是报错 Error:Cannot build artifact 'ssm:war exploded' because it is included into a circular dependency (artifact 'ssm:war exploded', artifact 'apinb-master:war exploded') 打开 File-

Photoshop Circular Text

Ctrl + N 新增 现学现卖