奶牛赛跑


目录

奶牛赛跑

题目描述

输入格式

输出格式

样例

样例输入#1

样例输出#1

题解

代码


题目描述

约翰有头奶牛,他为这些奶牛准备了一个周长为的环形跑牛场。所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第头牛的速度为。只要有一头奶牛跑完圈之后,比赛就立即结束了。

有时候,跑得快的奶牛可以比跑得慢的奶牛多绕赛场几圈,从而在一些时刻超过慢的奶牛。这就是最令观众激动的套圈事件了。请问在整个比赛过程中,套圈事件一共会发生多少次呢?

输入格式

• 第一行:三个整数; ;

• 第二行到第 N + 1 行:第 i + 1 行有一个整数 Vi,1 ≤ Vi ≤ 10^6

输出格式

单个整数:表示整个比赛过程中,套圈的次数之和。

样例

样例输入#1

样例输出#1

4 2 100
20
100
70
1
4

题解

由于题目里面说只要有一头跑完l圈那么所有的牛都会停下来

所以我们可以想给v数组排序(方便后面处理),并算出每头奶牛跑了多少圈(cycle数组)

显然第i头奶牛和第j头奶牛cycle之差下取整

那么题目就简化为给n个实数求每个数与它之前所有数之差下取整的和(n<=1e5显然n^2做法是不可行的,从取值范围可以看出应该是nlogn的)

先举个例子(cycle[i],cycle[j])=(4.8,5.7) 差的下取整是0 ,但(cycle[i],cycle[j])=(4.2,5.7) 差的下取整是1,

所以我们可以把cycle分成整数部分cycle,以及小数部分last

若last[i]>last[j],ans=cycle[j]-cycle[i]-1 若last[i]<=last[j],ans=cycle[j]-cycle[i]

所以我们可以在ans里面存下cycle之差然后再在last数组里找逆序对,逆序对有几个ans就得减多少

至于逆序对,我使用归并排序实现(merge为归并排序过程),也可以用树状数组等数据结构(还没写)

详见代码(注意double判断大小的时候用相减判断,不然会出现精度问题,刚开始直接比大小,wa了5个点)

代码

#include<bits/stdc++.h>
using namespace std;
long long i,j,l,m,n,v[100005],ans,c,cycle[100005];
double t,k,last[100005],b[100005];
void merge(int lef,int rig)
{
if (lef==rig) return;
if (lef==rig-1)
{
if (last[lef]-last[rig]>1e-7) ans--,swap(last[lef],last[rig]);
return;
}
int mid=(lef+rig)/2;
merge(lef,mid);
merge(mid+1,rig);
int i,j,l;
for (l=i=lef,j=mid+1; i<=mid&&j<=rig;)
{
if (last[i]-last[j]>1e-7)
{
ans-=(mid-i+1);
b[l++]=last[j++];
}
else b[l++]=last[i++];
}
for (; i<=mid;) b[l++]=last[i++];
for (; j<=rig;) b[l++]=last[j++];
for (i=lef; i<=rig; i++) last[i]=b[i];
}
int main()
{
scanf("%lld%lld%lld",&n,&l,&c);
for (i=1; i<=n; i++) scanf("%lld",&v[i]);
sort(v+1,v+n+1);
t=l*c*1.0/v[n];
m=0;
for (i=1; i<=n; i++)
{
cycle[i]=(long long)(t*v[i]/c);
ans+=(i-1)*cycle[i]-m;
m+=cycle[i];
last[i]=t*v[i]-cycle[i]*c;
}
merge(1,n);
printf("%lld",ans);
}

声明:该文章部分摘自这里,若有侵权,请及时联系!

【USACO 2012 Open】奶牛赛跑_题解的更多相关文章

  1. 【USACO 2012 Open】Running Laps(树状数组)

    53 奶牛赛跑 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈之后,比 ...

  2. USACO翻译:USACO 2012 FEB Silver三题

    USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...

  3. USACO翻译:USACO 2012 JAN三题(2)

    USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...

  4. NC24325 [USACO 2012 Mar S]Flowerpot

    NC24325 [USACO 2012 Mar S]Flowerpot 题目 题目描述 Farmer John has been having trouble making his plants gr ...

  5. USACO翻译:USACO 2012 JAN三题(1)

    USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery c ...

  6. BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP

    BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的 ...

  7. USACO奶牛赛跑(逆序对)

    Description 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈 ...

  8. [USACO]奶牛赛跑(逆序对)

    Description 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈 ...

  9. USACO 2012 Feb Cow Coupons

    2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec Memory Limit: 128 MB Submit: 349 Solved: 181 [Su ...

随机推荐

  1. apparmor 源码分析

    这里不对apparmor做介绍,记录一下源码分析过程. 初始化 static int __init apparmor_init(void) -> security_add_hooks(appar ...

  2. SecureCRT使用SSH链接出现Password Authentication Failed,Please verify that the username and password are correct的解决办法(亲测有效)

  3. Slab 分配器

    1.什么是Slab 分配器: 以下摘自维基百科:https://en.wikipedia.org/wiki/Slab_allocation Slab  firstly introduced in ke ...

  4. Java高并发-多线程基础

    一.什么是线程 线程是进程内的执行单元. 二.线程的基本操作 2.1 状态与操作 2.2 新建线程 Thread t1 = new Thread(new CreateThread()); t1.sta ...

  5. 自学c语言

    C 语言是一种通用的.面向过程式的计算机程序设计语言. 当前最新的 C 语言标准为 C18 前期准备 C 编译器  写在源文件中的源代码是人类可读的源.它需要"编译",转为机器语言 ...

  6. 第06组 Beta冲刺 (4/5)

    目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.曾丽莉 4.鲍凌函 5. 董翔云 6.黄少丹 7.杜筱 8.詹鑫冰 9.曹兰英 10.吴沅静 1.3 冲刺成果展示 1.1 ...

  7. Spring IOC源码研究笔记(2)——ApplicationContext系列

    1. Spring IOC源码研究笔记(2)--ApplicationContext系列 1.1. 继承关系 非web环境下,一般来说常用的就两类ApplicationContext: 配置形式为XM ...

  8. 『忘了再学』Shell基础 — 26、cut列提取命令

    目录 1.cut命令说明 2.cut命令练习 (1)cut命令基本用法 (2)cut命令选取多列 (3)按字符来进行提取 (4)按指定分隔符进行截取数据 3.cut命令分隔符说明 1.cut命令说明 ...

  9. 浏览器代理user-agent

    两种方法: 法1:浏览器地址栏输入:about://version,然后复制用户代理: 如果法1不行,法2肯定可以. 法2:打开任意浏览器,输入任意网址,下面以火狐和百度网址为例来进行说明: 打开火狐 ...

  10. 10分钟快速部署camunda BPM开源版

    安装部署Camunda BPM有多种方式,基于Camunda独立web应用程序安装部署是最简单的一种方式,您只需要有tomcat即可. 本文档将指导您安装和配置Camunda独立web应用程序,快速体 ...