zoukankan      html  css  js  c++  java
  • luogu3111 [USACO14DEC]牛慢跑Cow Jog_Sliver

    题目大意

    有N (1 <= N <= 100,000)头奶牛在一个单人的超长跑道上慢跑,每头牛的起点位置都不同。由于是单人跑道,所有他们之间不能相互超越。当一头速度快的奶牛追上另外一头奶牛的时候,他必须降速成同等速度。我们把这些跑走同一个位置而且同等速度的牛看成一个小组。
    请计算T (1 <= T <= 1,000,000,000)时间后,奶牛们将分为多少小组。

    题解

    定义两头牛“能单独追上”为:若跑道上只有这两头牛,则它们能否追上。牛i和牛j(j>i)将会位于同一小组当且仅当j是位于i前方牛群中第一个能被i单独追上的牛(注意:是【前方牛群】,而不是【前方的牛】)。因为j一定时,能追上j的i有多个,所以倒序枚举。
    注意:如果要暴力对拍,暴力程序应当尽量简单。如果写暴力程序无法保证正确性,写暴力程序也不值了。

    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    #define ll long long
    
    const int MAX_COW = 100010;
    ll N, T;
    
    struct Cow
    {
    	ll Pos, V;
    }_cows[MAX_COW];
    
    int main()
    {
    	scanf("%lld%lld", &N, &T);
    	for (int i = 1; i <= N; i++)
    		scanf("%lld%lld", &_cows[i].Pos, &_cows[i].V);
    	ll groupCnt = N;
    	int p = N;
    	for (int i = N - 1; i >= 1; i--)
    	{
    		if ((_cows[i].V - _cows[p].V)*T >= _cows[p].Pos - _cows[i].Pos)
    			groupCnt--;
    		else
    			p = i;
    	}
    	printf("%lld
    ", groupCnt);
    	return 0;
    }
    
  • 相关阅读:
    [BZOJ4825][HNOI2017]单旋(线段树+Splay)
    [BZOJ4542][HNOI2016]大数(莫队)
    [LOJ6281]数列分块入门 5
    [LOJ6280]数列分块入门 4
    [LOJ6279]数列分块入门 3
    [LOJ6278]数列分块入门 2
    [LOJ6277]数列分块入门 1
    [BZOJ2120]数颜色
    [BZOJ3585]mex
    [ZJb417]区间众数
  • 原文地址:https://www.cnblogs.com/headboy2002/p/9028111.html
Copyright © 2011-2022 走看看