USACO 2016 February Contest, Gold解题报告
1.Circular Barn
http://www.usaco.org/index.php?page=viewproblem2&cpid=621
贪心
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
long long sum(long long v)
{
return v*(v+)*(*v+)/;
}
int main()
{
int N,c=;
scanf("%d",&N);
vector<long long> A(N);
for(int i=;i<N;i++)
{
scanf("%d",&A[i]);
c=max(0ll,c+A[i]-);
}
for(int i=;;i++)
{
if(c==)
{
rotate(A.begin(),A.begin()+i,A.begin()+N);
break;
}
c=max(0ll,c+A[i]-);
}
long long res=;
for (int i=;i<N;i++)
{
res+=sum(A[i]+c-)-sum(c-);
c=max(0ll,c+A[i]-);
}
printf("%d",res);
}
2.Circular Barn Revisited
http://www.usaco.org/index.php?page=viewproblem2&cpid=622
首先,记录从i开始的j个房间的奶牛都从i从i号门进入所走的总距离。
然后进行dp,找出最小路程
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100
#define MAXK 7
int n,r[MAXN+],k;
long long f[MAXN*+][MAXN+][MAXK+],ans=0x7fffffffffffffffll,dist[MAXN+][MAXN+];
void Read(int &x){
char c;
while(c=getchar(),c!=EOF)
if(c>=''&&c<=''){
x=c-'';
while(c=getchar(),c>=''&&c<='')
x=x*+c-'';
ungetc(c,stdin);
return;
}
}
void read(){
Read(n),Read(k);
int i;
for(i=;i<=n;i++)
Read(r[i]);
}
void prepare(){
int i,j;
for(i=;i<=n;i++){
dist[i][]=;
for(j=;j<=n;j++)
dist[i][j]=r[(i+j-)%n+]*(j-)+dist[i][j-];
}
}
void dp(){
int i,j,l,t=*n,p;
memset(f,0x3f,sizeof f);
for(i=;i<=t;i++)
f[i][][]=;
for(i=;i<=n;i++){
for(j=;j<=n&&j<=i;j++)
for(l=;l<=k;l++)
for(p=;p<=j;p++)
f[i][j][l]=min(f[i][j][l],f[i-p][j-p][l-]+dist[i-p+][p]);
ans=min(ans,f[i][n][k]);
}
for(i=n+;i<=t;i++){
for(j=;j<=n;j++)
for(l=;l<=k;l++)
for(p=;p<=j;p++)
f[i][j][l]=min(f[i][j][l],f[i-p][j-p][l-]+dist[(i-p)%n+][p]);
ans=min(ans,f[i][n][k]);
}
}
int main()
{
read();
prepare();
dp();
printf("%lld\n",ans);
}
3.Fenced In
最小生成树
处理出连通块之间栅栏的长度然后做最小生成树即可。 但是这样会T,尽管算法时间复杂度为 O(n2log2n)
优化:由于每一行或每一列中的相邻两个连通块之间的栅栏长度相等,我们可以考虑使用kruskal算法,仅仅对每两个栅栏之间的距离排序,然后然后再对这一行(列)的所有相邻连通块连边即可。
#include<cstdio>
#include<algorithm>
#define MAXN 2000
using namespace std;
long long ans;
int n,a[MAXN+],b[MAXN+],A,B,m,tot,fa[(MAXN+)*(MAXN+)+];
void Read(int &x){
char c;
while(c=getchar(),c!=EOF)
if(c>=''&&c<=''){
x=c-'';
while(c=getchar(),c>=''&&c<='')
x=x*+c-'';
ungetc(c,stdin);
return;
}
}
void read(){
int i,t;
Read(A),Read(B),Read(n),Read(m);
for(i=;i<=n;i++)
Read(a[i]);
for(i=;i<=m;i++)
Read(b[i]);
sort(a+,a+n+);
sort(b+,b+m+);
a[++n]=A;
b[++m]=B;
for(i=n;i;i--)
a[i]-=a[i-];
for(i=m;i;i--)
b[i]-=b[i-];
sort(a+,a+n+);
sort(b+,b+m+);
t=n*m;
for(i=;i<=t;i++)
fa[i]=i;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void kruskal(){
int i,j,k,l;
i=j=;
while(i<=n||j<=m){
if(j>m||(i<=n&&a[i]<=b[j])){
k=(i-)*m+;
for(l=;l<m;l++,k++)
if(find(k)!=find(k+))
fa[fa[k]]=fa[k+],ans+=a[i];
++i;
}
else{
k=j;
for(l=;l<n;l++,k+=m)
if(find(k)!=find(k+m))
fa[fa[k]]=fa[k+m],ans+=b[j];
++j;
}
}
}
int main()
{
read();
kruskal();
printf("%lld\n",ans);
}
USACO 2016 February Contest, Gold解题报告的更多相关文章
- USACO 2016 January Contest, Gold解题报告
1.Angry Cows http://www.usaco.org/index.php?page=viewproblem2&cpid=597 dp题+vector数组运用 将从左向右与从右向左 ...
- USACO 2016 US Open Contest, Gold解题报告
1.Splitting the Field http://usaco.org/index.php?page=viewproblem2&cpid=645 给二维坐标系中的n个点,求ans=用一个 ...
- USACO Section2.2 Preface Numbering 解题报告 【icedream61】
preface解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.1 Hamming Codes 解题报告 【icedream61】
hamming解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】
holstein解题报告 --------------------------------------------------------------------------------------- ...
- USACO Section2.1 The Castle 解题报告
castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.5 Prime Palindromes 解题报告
pprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section2.3 Controlling Companies 解题报告 【icedream61】
concom解题报告------------------------------------------------------------------------------------------ ...
- USACO Section2.3 Money Systems 解题报告 【icedream61】
money解题报告------------------------------------------------------------------------------------------- ...
随机推荐
- linux下如何使用split
答: 切割文件hello,以每个文件最大10MiB来切割,切割好的文件名前缀为hello.,后缀为二位的数字,切割之后的名字为hello.01,hello.02等等 split -b 10M - ...
- Nginx + LUA下流量拦截算法
前言 每逢大促必压测,每逢大促必限流,这估计是电商人的常态.每次大促期间,业务流量是平时的几倍十几倍,大促期间大部分业务都会集中在购物车结算,必须限流,才能保证系统不宕机. 限流算法 限流算法一般有三 ...
- Ant Design of Angular
1.按照官方的方法,报了这个 node_modules/rxjs/internal/types.d.ts(81,74): error TS1005: ';' expected.node_modules ...
- VuePress从零开始搭建自己的博客
VuePress是什么? VuePress是以Vue驱动的静态网站生成器,是一个由Vue.Vue Router和webpack驱动的单页应用.在VuePress中,你可以使用Markdown编写文档, ...
- [osgearth]通过API创建一个earth模型
通过API的方式大体需要以下几个步骤: 创建map对象—— 创建影像数据层—— 创建高程数据层—— 将影像数据层以及高程数据层加入到map对象—— 根据前面创建的map对象创建mapNode节点—— ...
- Android-----购物车(包含侧滑删除,商品筛选,商品增加和减少,价格计算,店铺分类等)
电商项目中常常有购物车这个功能,做个很多项目了,都有不同的界面,选了一个来讲一下. 主要包含了 店铺分类,侧滑删除,商品筛选,增加和减少,价格计算等功能. 看看效果图: 重要代码: private v ...
- linux shell 按行循环读入文件方法
转http://blog.csdn.net/hittata/article/details/7042779 #/bin/bash printf "******************** ...
- bzoj-3195-状压dp
3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 600 Solved: 395[Submit][Statu ...
- ASP.NET Page 指令
一些重要的Page指令 虽然Page公开了很多属性,让我们可以在运行时调整它的状态与行为,但是,还有些重要的参数却是以“指令”方式提供的,需要在设计时就指定.下面是我整理的一些我认为 比较重要并且经常 ...
- SGU 219 Synchrograph tarjian找环,理解题意,图论 难度:3
http://acm.sgu.ru/problem.php?contest=0&problem=219 题目大意: 如果指向某个点的边权全都为正数,那么这个点就是可点燃的,点燃操作把入弧权值- ...